C# 为什么需要在WPF应用程序中调用PropertyChanged

C# 为什么需要在WPF应用程序中调用PropertyChanged,c#,wpf,C#,Wpf,我正在开发我的第一个MVVM WPF应用程序 在视图中属性的所有模型代码中,我调用IPropertyChanged的代码。我的代码可以工作,但我不明白我为什么要这么做 为什么.NET不“知道”属性值已更改?为什么我必须显式调用PropertyChanged才能刷新UI?当您打算在运行时动态设置源属性并希望视图“自动”时,只需要实现INotifyPropertyChanged接口并引发数据绑定属性的PropertyChanged事件已通知此更改 如果不引发此事件,则不能假定WPF知道何时更新视图中

我正在开发我的第一个MVVM WPF应用程序

在视图中属性的所有模型代码中,我调用IPropertyChanged的代码。我的代码可以工作,但我不明白我为什么要这么做


为什么.NET不“知道”属性值已更改?为什么我必须显式调用PropertyChanged才能刷新UI?

当您打算在运行时动态设置源属性并希望视图“自动”时,只需要实现
INotifyPropertyChanged
接口并引发数据绑定属性的
PropertyChanged
事件已通知此更改

如果不引发此事件,则不能假定WPF知道何时更新视图中的数据绑定值

在幕后,WPF订阅此事件并“自动”处理视图中的刷新功能。您所需要做的就是告诉它何时刷新目标属性,并且执行此操作的方法是实现
INotifyPropertyChanged
接口


希望这能回答你的问题。

你的观点不正确。NET不知道数据已更改。更改属性值只是将新内容放入内存位置。代码的任何其他部分,包括框架(也只是一个普通代码)都无法知道内存内容已经更改

为了让其他人知道,您通常实现可观察的模式。保存更改值的对象允许其他对象将自己添加到“观察者”列表中

然后,当它包含的值发生更改时,它会对每个观察者调用一个方法:

// 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
接口是在这种情况下实现可观察模式的正式方式


您的数据类将使UI有机会注意到数据已被修改,并相应地刷新UI控件的内容。

我们应该如何回答这个问题?您需要询问.NET开发人员。但总的来说,如果我们不需要在每一个特定的情况下都更改属性,那么为什么我们总是默认更改属性呢?在getter/setter和底层字段中做什么取决于您自己,那么.NET怎么可能知道何时必须为任何给定属性发出属性更改事件呢?“.NET为什么不只是“知道”-因为它是一个具有某些限制的编程框架,而不是魔术。如果你想要某种魔力-试试@ASh:即使这种魔力也无法知道什么时候属性会因为某些内部状态的改变而改变,而这些改变不是由属性的setter触发的。@FINDarkside:好的,只适用于依赖对象上的依赖属性。但是这些在幕后实现了与INPC几乎相同的东西。他只是使用了错误的术语。他可能问的是为什么属性不能自动实现PropertyChanged。我不确定。。。无论如何,我试图解释整个机制,这样就不会有误解。
// 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();
        }
    }
}