了解INotifyPropertyChanged

时间:2014-06-19 14:55:37

标签: c# wpf mvvm

当我们实施INotifyPropertyChanged时,它通知什么?

它只是通知视图(我怀疑它),还是每个具有名称的属性(可能会产生不必要的影响)。或者它只是DataContext中存在的属性(因为模型中可能没有DataContext而令人怀疑)?

是否可以拥有像

这样的单一功能
public class Demo : BaseViewModel
{
    public void UpdateAll()
    {
        //Update properties which do not exist in this class
        OnPropertyChanged("NameFromClassA");
        OnPropertyChanged("NameFromClassB");
        OnPropertyChanged("AgeInClassA");
        OnPropertyChanged("AgeInClassC");
    }
}

我试过了,但我无法让它发挥作用。 “输出”窗口中没有绑定错误,也没有任何运行时/编译器问题。

2 个答案:

答案 0 :(得分:1)

INotifyPropertyChanged接口用于通知客户端(通常是绑定客户端)属性值已更改。

例如,考虑具有名为FirstName的属性的Person对象。要提供通用属性更改通知,Person类型实现INotifyPropertyChanged接口,并在FirstName更改时引发PropertyChanged事件。

要在绑定客户端和数据源之间的绑定中发生更改通知,您的绑定类型应该是: 实现INotifyPropertyChanged接口(首选)。 为绑定类型的每个属性提供更改事件。

对于示例程序,请检查:MSDN

答案 1 :(得分:1)

The INotifyPropertyChanged interface is used to notify clients, typically binding clients, that a property value has changed.

OnPropertyChanged("NameFromClassA")通常在BaseViewModel Class中实施,相当于:

    if (this.PropertyChanged != null)
      this.PropertyChanged(this, new PropertyChangedEventArgs("NameFromClassA"));

它会告诉正在聆听您的演示PropertyChanged Class事件的人,Property名为" NameFromClassA"已经改变了价值(你的例子是错误的,因为Property中没有Class这样的内容。

DependencyProperties绑定到Properties您的VM需要自行更新,并且很少用于其他任何操作。


修改

Psoeudo代码的大致等同于绑定引擎在幕后的作用:

ClassA myClassA;
string myPropertyBoundToNameOfClassA;

// somewhere after myClassA was initialized
myClassA.PropertyChanged += OnMyClassAPropertyChanged;

void MyClassAPropertyChanged(string name)
{
   if (name == "NameFromClassA")
       myPropertyBoundToNameOfClassA = myClassA.Name;
}