尝试了解 INotifyPropertyChanged
-
12-09-2019 - |
题
几个(新手)问题:
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 中
< Button IsEnabled="{Binding CanDeletePerson}"
Command="{Binding DeletePersonCommand}"> Delete </ Button >
如何让它重新评估 CanDeletePerson 属性?基本上,它最初被禁用,但是当我单击网格并将行移动到行时,SelectedPerson 正在更新,但 CanDeletePerson 没有获取更新的值,那么我如何让它真正再次检查该值?
3)我明白了
...取决于是否有任何内容订阅了该事件
您如何订阅该活动?
解决方案
- 正确 - 不会触发
是的,要有
CanDeletePerson
重新评估后,您可以在以下日期提出 PropertyChangedCanDeletePerson
, ,像这样set { if ((this.selectedPerson != value)) { this.selectedPerson = value; base.OnPropertyChanged("SelectedPerson"); base.OnPropertyChanged("CanDeletePerson"); } }
与任何普通事件一样,但如果您使用 WPF,通常不需要显式订阅
其他提示
是的,自动属性不火的PropertyChanged
事件。
您可以得到CanDeletePerson
通过添加OnPropertyChanged("CanDeletePerson")
到SelectedPerson
制定者重新评估。
我不知道,如果你的最后一位是一个问题,但你可以订阅PropertyChanged事件像任何其他事件。 MyClass.PropertyChanged += MyClassPropertyChanged
其中MyClassPropertyChanged是
private void MyClassPropertyChanged(object sender, PropertyChangedEventArgs args)
{
args.PropertyName .... //<-- Name of property changed.
}
但你不应该需要。 WPF确实订阅到它所需要的事件。
这里的一个链接到一个良好的制品引入MVVM模式
特别是,如果你看一下RelayCommand类,它实现一个ICommand对象,并允许你指定一个谓词来评估命令是否可以执行的很好的工作。
的canExecute谓词在RelayCommand评价从一个单独的属性结合到按钮的IsEnabled属性可以节省。
我通常遵循的示例实施这对于canExecute谓词提供布尔值的私有财产的文章。
这文章给了我一个很好的帮助开始使用的模式。
如果您使用PropertyChanged事件,你的类必须实现INotifyProperyChanged接口,并在必要时引发事件。 在WPF中,对于数据绑定默认是DependencyProperty的,所以如果你有PropertyChanged事件的工作,你必须做一些事情到XAML(假设你的类人都在那里你提高PropertyChanged事件Name属性):
<TextBlock Text={Binding Path=Name, UpdateSourceTrigger=PropertyChanged} />