RaisePropertyChanged的重要性是什么?

时间:2014-07-03 19:57:14

标签: c# .net mvvm mvvm-light

我目前正在学习MVVM,我不明白RaisePropertyChanged是如何重要的

例如这个函数:

public City SelectedCity
{
    get
    {
        return selectedcity;
    }
    set
    {
        RaisePropertyChanging(SelectedCityLocationPropertyName);
        selectedtrend = value;
        RaisePropertyChanged(SelectedCityLocationPropertyName);
        MessageBox.Show(City.Name);
    }
}

和这一个:

public City SelectedCity
{
    get
    {
        return selectedcity;
    }
    set
    {
        //   RaisePropertyChanging(SelectedCityLocationPropertyName);
        selectedtrend = value;
        //   RaisePropertyChanged(SelectedCityLocationPropertyName);
        MessageBox.Show(City.Name);
    }
}

给我完全相同的结果。你能否告诉我为什么RaisePropertyChanged如此重要并给我一个例子来说明它会产生重大影响?

3 个答案:

答案 0 :(得分:7)

阅读本文:

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

RaisePropertyChanging事件用于通知UI或绑定元素数据已更改。例如,TextBox需要在基础数据更改时接收通知,以便它可以更新您在UI中看到的文本。如果没有NotifyPropertyChanged事件,TextBox将不知道数据已更改。

这在MVVM中非常重要。

答案 1 :(得分:2)

RaisePropertyChange是指示属性状态发生变化的事件,指向订阅该类的人。如果你看一下MVVM灯中的基类,你会发现它遵守INotifyPropertyChanged

当属性通知订户更改时(很可能是Xaml中的绑定),事件的使用者知道用新数据更新控件。这允许视图异步更新,而不必直接更新任何绑定控件。

请参阅我对MVVM update of calculated properties的回答,了解可以使用INotifyPropertyChange推送更新的示例。

同样在我的博客上,我讨论了MVVM绑定(MVVM光只是一个包装器)Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding.,它可以告诉你如何在没有MVVM光辅助包装器的情况下完成它。

答案 2 :(得分:1)

WPF绑定机制依赖于每个 FrameworkElement DataContext 提升 PropertyChanged 事件,以便它的依赖属性,以便对它们所绑定的普通CLR属性的值进行采样。

依赖属性< - 绑定 - >普通CLR财产

加载时,每个FrameworkElement的依赖项属性都将从绑定的CLR属性中获得值。

Binding引擎侦听PropertyChanged事件, 引发时,它会找到绑定CLR属性的相应依赖项属性(属性),该属性在事件args中给出,并从中更新它们的值(此时您将到达CLR属性的getter)。