【发布时间】:2019-08-23 11:21:13
【问题描述】:
我是 mvvm 的初学者,为了学习它,我想构建某种应用程序。所以我正在做一些类似我的电影、文件等的数据库。我想在设置中选择像所有文件的主文件夹这样的东西。像父节点这样的东西。
为此,我使用旁边带有按钮 [...] 的文本框。 文本块应该仅用于显示文件的路径。
程序启动后,在textBox内显示默认值,但之后我无法捕捉到变化。 FileInfo 属性被更改,属性也可以从中检索路径。还调用了 OnPropertyChanged() 但复选框仍处于默认状态,没有值更改。你知道为什么它不适合我吗?谢谢!
class SettingsViewModel : ObservableObject, IPageViewModel
{
private AppSettings settings;
public AppSettings Settings { get => settings;}
public SettingsViewModel()
{
settings = new AppSettings();
}
private void ChangeFilmsFolderButton_Click(object obj)
{
string name = Settings.GeneralFilmsFolderPath; //old value
Settings.AddPathToFilmsFolder();
name = Settings.GeneralFilmsFolderPath; //new value
}
}
class AppSettings : ObservableObject
{
private FileInfo _generalFilmsFolder;
private string _generalFilmsFolderPath;
public FileInfo GeneralFilmsFolder
{
get => _generalFilmsFolder;
set
{
_generalFilmsFolder = value;
GeneralFilmsFolderPath = _generalFilmsFolder.FullName;
}
}
public string GeneralFilmsFolderPath {
get => _generalFilmsFolderPath;
set {
_generalFilmsFolderPath = value;
OnPropertyChanged("GeneralFilmsFolderPath");
}
}
public void AddPathToFilmsFolder()
{
CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;
dialog.Multiselect = false;
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
{
if (Directory.Exists(dialog.FileName))
GeneralFilmsFolder = new FileInfo(dialog.FileName);
}
}
}
SettingsView XAML
<TextBox IsReadOnly="True" HorizontalAlignment="Left" Height="20" Margin="74,2,0,0" TextWrapping="Wrap" Text="{Binding Settings.GeneralFilmsFolderPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="73"/>
【问题讨论】:
-
您是否尝试过仅使用 INotifyPropertyChanged 而不是使用来自 MVVM 灯光的 ObservableObject?
标签: mvvm inotifypropertychanged propertygrid