2017-02-14 93 views
-2

我正在开发我的第一个MVVM WPF应用程序。为什么需要在WPF应用程序中调用PropertyChanged

在我看来的所有属性模型代码中,我调用了IPropertyChanged的代码。我的代码有效,但我不明白我为什么要这样做。

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

+0

我们应该如何回答?你需要问.NET开发者。但总的来说,为什么我们应该默认情况下总是有一个PropertyChanged,如果我们在每个特定情况下都不需要它的话。 – bslein

+0

'为什么.Net只是“知道”' - 好吧,它怎么知道?这取决于你在getter/setter和底层字段中所做的事情,那么.NET如何才能知道何时必须为任何给定的属性发布属性更改事件? –

+0

“为什么.Net只是”知道“” - 因为它是一个具有一定限制的编程框架,而不是** magic **。如果你想要一些魔法 - 尝试[Fody.PropertyChanged](https://github.com/Fody/PropertyChanged) – ASh

回答

1

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

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

在幕后,WPF订阅了此事件,并在视图中为您“自动”处理刷新功能。你所要做的就是告诉它什么时候刷新目标属性,并且你这样做的方式是实现接口INotifyPropertyChanged

希望这会回答你的问题。

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应用程序,用户界面元素是观察员。你正在将它们与你的数据类连接起来。接口是在这种情况下实现Observable模式的正式方式。

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

+0

他只是用了错误的名词。他可能要问的是为什么不能自动实现PropertyChanged。 – FINDarkside

+0

我不确定...无论如何,我试图解释整个机制,以免误解。 –

相关问题