试图了解INotifyPropertyChanged
几个(新手)问题:
1)我看到了很多
public Person SelectedPerson { get; set; }
我假设这不会引发财产变更?
那么,如果我想这样做,我必须提供以下内容?
private Person selectedPerson; public Person SelectedPerson { get { return this.selectedPerson; } set { if ((this.selectedPerson != value)) { this.selectedPerson = value; base.OnPropertyChanged("SelectedPerson"); // Note: Using ViewModelBase } } }
2)如果我有以下内容:
public bool CanDeletePerson { get { return SelectedPerson != null; } }
以及XAML
如何让它重新评估CanDeletePerson属性? 基本上,它最初被禁用,但是当我单击网格并将行移动到行时,SelectedPerson IS正在更新,但CanDeletePerson没有获得更新的值,那么如何让它再次实际检查该值?
3)我明白了
…取决于是否有任何订阅该事件
你如何订阅这个活动?
- 正确 – 不会发射
-
是的,要重新评估
CanDeletePerson
,您可以在CanDeletePerson
上提升PropertyChanged,就像这样set { if ((this.selectedPerson != value)) { this.selectedPerson = value; base.OnPropertyChanged("SelectedPerson"); base.OnPropertyChanged("CanDeletePerson"); } }
-
与任何正常事件一样,但如果您使用的是WPF,则通常不需要明确订阅
是,自动属性不会触发PropertyChanged
事件。
您可以通过将CanDeletePerson
OnPropertyChanged("CanDeletePerson")
到SelectedPerson
setter来重新评估OnPropertyChanged("CanDeletePerson")
。
我不确定你的最后一点是否是一个问题,但你可以像任何其他事件一样订阅PropertyChanged事件。 MyClass.PropertyChanged += MyClassPropertyChanged
MyClassPropertyChanged的位置
private void MyClassPropertyChanged(object sender, PropertyChangedEventArgs args) { args.PropertyName .... //<-- Name of property changed. }
但你不应该这样做。 WPF会订阅它所需的事件。
这是一篇介绍MVVM模式的好文章的链接。
具体来说,如果查看RelayCommand类,它可以很好地实现ICommand对象,并允许您指定谓词来评估Command是否可以执行。
在RelayCommand中对canExecute谓词的求值可以避免将单独的属性绑定到Button的IsEnabled属性。
我通常遵循实现私有属性的文章中的示例,该属性为canExecute谓词提供布尔值。
那篇文章对我开始使用这个模式很有帮助。
如果使用PropertyChanged事件,则您的类需要实现INotifyProperyChanged接口并在必要时引发事件。 在WPF中,数据绑定的默认值是DependencyProperty,因此如果您使用PropertyChanged事件,则必须对XAML执行某些操作(假设您的类人员具有Name属性,您可以在其中引发PropertyChanged事件):