我正在开发我的第一个MVVM WPF应用程序。为什么需要在WPF应用程序中调用PropertyChanged
在我看来的所有属性模型代码中,我调用了IPropertyChanged的代码。我的代码有效,但我不明白我为什么要这样做。
为什么.NET只是“知道”属性值已经改变?为什么我必须显式调用PropertyChanged才能刷新UI?
我正在开发我的第一个MVVM WPF应用程序。为什么需要在WPF应用程序中调用PropertyChanged
在我看来的所有属性模型代码中,我调用了IPropertyChanged的代码。我的代码有效,但我不明白我为什么要这样做。
为什么.NET只是“知道”属性值已经改变?为什么我必须显式调用PropertyChanged才能刷新UI?
当您打算在运行时动态设置源属性并希望视图被“自动”通知此更改时,只需要实现INotifyPropertyChanged
接口并为数据绑定属性提高PropertyChanged
事件。
如果您不引发此事件,则WPF无法知道何时更新视图中的数据绑定值。
在幕后,WPF订阅了此事件,并在视图中为您“自动”处理刷新功能。你所要做的就是告诉它什么时候刷新目标属性,并且你这样做的方式是实现接口INotifyPropertyChanged
。
希望这会回答你的问题。
你在这里有一个不正确的观点。 .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应用程序,用户界面元素是观察员。你正在将它们与你的数据类连接起来。接口是在这种情况下实现Observable模式的正式方式。
您的数据类将使UI有机会注意到数据已被修改并相应地刷新UI控件的内容。
他只是用了错误的名词。他可能要问的是为什么不能自动实现PropertyChanged。 – FINDarkside
我不确定...无论如何,我试图解释整个机制,以免误解。 –
我们应该如何回答?你需要问.NET开发者。但总的来说,为什么我们应该默认情况下总是有一个PropertyChanged,如果我们在每个特定情况下都不需要它的话。 – bslein
'为什么.Net只是“知道”' - 好吧,它怎么知道?这取决于你在getter/setter和底层字段中所做的事情,那么.NET如何才能知道何时必须为任何给定的属性发布属性更改事件? –
“为什么.Net只是”知道“” - 因为它是一个具有一定限制的编程框架,而不是** magic **。如果你想要一些魔法 - 尝试[Fody.PropertyChanged](https://github.com/Fody/PropertyChanged) – ASh