我正在开发我的第一个MVVM WPF应用程序。
在我视图中属性的所有模型代码中,我调用了IPropertyChanged的代码。我的代码有效,但我不明白我为什么要这样做。
为什么.NET不仅仅知道"财产价值发生了变化?为什么我必须显式调用PropertyChanged才能刷新UI?
答案 0 :(得分:1)
当您打算在运行时动态设置源属性并希望视图为&#时,只需要实现INotifyPropertyChanged
接口并为数据绑定属性引发PropertyChanged
事件。 34;自动"通知此更改。
如果您不提出此事件,则无法知道WPF何时更新视图中的数据绑定值。
在幕后,WPF订阅此活动并自动处理视图中的刷新功能"自动"。您需要做的就是告诉它何时刷新目标属性,执行此操作的方法是实现INotifyPropertyChanged
接口。
希望这能回答你的问题。
答案 1 :(得分:1)
你这里的观点不正确。 .NET不知道数据是否已更改。更改属性值只是将新内容放入内存位置。没有办法让代码的任何其他部分,包括框架(这只是一个公共代码)知道内存内容已经改变。
为了让别人知道,你通常会实现Observable模式。保存更改值的对象允许其他对象将自己添加到"观察者列表中。
// principal solution, not a real code
class DataClass
{
List observers;
public void Add(observer)
{
observers.Add(observer);
}
}
然后,当它包含的值发生变化时,它会在每个观察者上调用一个方法:
// Again the principal code, not real solution
class DataClass
{
private int data;
public void SetData(int value)
{
data = value; // Nobody knows this has happened
// And now the others should be notified
foreach (observer in observers)
{
observer.NotifyDataChanged();
}
}
}
在WPF应用程序中,UI元素是观察者。您正在将它们与数据类连接起来。 INotifyPropertyChanged
接口是在这种情况下实现Observable模式的正式方法。
您的数据类将使UI有机会注意到数据已被修改并相应地刷新UI控件的内容。