我为一个简单的WPF view-viewmodel实现了INotifyPropertyChanged接口,当我调用我的
时protected void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
在GoodText的设置上如
this.RaisePropertyChanged("GoodText");
PropertyChanged事件有一个我从未分配给它的方法。
何时分配?谁做到了?
修改
谢谢你,非常好的建议,但我认为Willem的回答是我正在寻找的,我的意思是:当我说的时候
<Button Content="Button" Command="{Binding CheckButtonCommand}" />
这就像(丑陋的伪代码)
PropertyChanged += Button.GiveMeThePropertyValue;
? 那么绑定是否将处理程序添加到PropertyChanged事件?
答案 0 :(得分:1)
这是“类似田野的事件”的神奇之处,也是代表们的神奇之处。
首先是类似字段的事件:对于外部调用者,它们看起来像event
- 具有add
/ remove
个访问者;它们只能与+=
/ -=
一起使用。但是,对于声明类型,它们看起来更像是 字段 - 因此您可以直接访问该委托。包括阅读和分配价值。
至于方法的来源。那就是(某种程度上)委托是什么。这实际上是委托实例上的.Invoke(...)
;但.Invoke
是隐含的。对于任何代表都会发生这种情况,例如:
Action<string> action = s => Console.WriteLine(s);
// following are identical (but with different values, obviously)
action("hello");
action.Invoke("world");
但有几点建议:
1:目前有一个非常小的乱七八糟的线索比赛;我建议:
var handler = PropertyChanged;
if(handler != null) handler(this, ...);
2:对于最近的编译器,你可以避免文字:
protected void RaisePropertyChanged([CallerMemberName] string propertyName=null)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
允许您从GoodText
属性中将其称为:
this.RaisePropertyChanged();
更少的代码=更少出错的地方(复制/粘贴名称等)
答案 1 :(得分:1)
最有可能的是,属性(以及类)是XAML(或通过代码)绑定的数据。
如果绑定到实现INotifyPropertyChanged的类,则绑定到源类的UIElement将连接一个事件处理程序,以便能够监视属性更改。