当我们实施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");
}
}
我试过了,但我无法让它发挥作用。 “输出”窗口中没有绑定错误,也没有任何运行时/编译器问题。
答案 0 :(得分:1)
INotifyPropertyChanged接口用于通知客户端(通常是绑定客户端)属性值已更改。
例如,考虑具有名为FirstName的属性的Person对象。要提供通用属性更改通知,Person类型实现INotifyPropertyChanged接口,并在FirstName更改时引发PropertyChanged事件。
要在绑定客户端和数据源之间的绑定中发生更改通知,您的绑定类型应该是: 实现INotifyPropertyChanged接口(首选)。 为绑定类型的每个属性提供更改事件。
对于示例程序,请检查:MSDN
答案 1 :(得分:1)
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;
}