PropertyChanged方法赋值

时间:2013-05-20 13:22:09

标签: c# inotifypropertychanged

我为一个简单的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事件?

2 个答案:

答案 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将连接一个事件处理程序,以便能够监视属性更改。