【发布时间】:2014-03-18 20:40:22
【问题描述】:
在尝试的 MVVM 实现中,我有一个实现 INotifyPropertyChanged 的用户控件。 OnFilePathsChanged 似乎在 FilePaths 具有新值之后被调用,所以它只是再次复制它。如果我不实施 INotifyPropertyChanged OnPropertyChanged,则 VIEWMODEL 永远不会更新。我已经读过将 INotifyPropertyChanged 与 DependencyProperty 一起使用是多余的,但我想不出最好的方法来做到这一点。我错过了什么。有没有更简洁的方法来实现带有绑定 ObservableCollection 的 UserControl?
用户控制代码
private void LoadFileMenuItem_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
if (dialog.ShowDialog() == true)
{
FilePaths.Add(dialog.FileName);
OnPropertyChanged("FilePaths");
}
}
private void InitFilePathsProperty()
{
this.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(FilePaths_PropertyChanged);
}
void FilePaths_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
this.SetValue(FilePathsProperty, ImageFilePaths);
}
public static readonly DependencyProperty FilePathsProperty = DependencyProperty.Register("FilePaths", typeof(ObservableCollection<string>), typeof(FileDisplayControl),
new PropertyMetadata(OnImageFilePathsChanged));
private static void OnFilePathsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
if (args.NewValue != null)
{
var myFileDisplayControl = obj as FileDisplayControl;
if (myFileDisplayControl != null &&
myFileDisplayControl.FilePaths != null)
{
FilePaths = this.GetValue(args.Property) as ObservableCollection<string>;
}
}
}
public ObservableCollection<string> FilePaths
{
get { return this.GetValue(FilePathsProperty) as ObservableCollection<string>; }
set { this.SetValue(FilePathsProperty, value); }
}
在视图模型中
public ObservableCollection<string> ViewModelFilePaths
{
get { return _viewModelFilePaths; }
set { _viewModelFilePaths = value; }
}
【问题讨论】: