在特定对象上引发PropertyChanged事件

时间:2018-06-21 11:09:43

标签: c# wpf mvvm data-binding

所以我有一个处理某些应用程序数据的类(称为DataClass)。该类实现了INotifyPropertyChanged接口。目前,我在ViewModelBase类中创建了2个此类的静态实例(DataRx和DataTx),我想分别引发每个类的PropertyChanged事件。 在ViewModel上,实现为:

DataRx.PropertyChanged += DataRx_PropertyChanged;
DataTx.PropertyChanged += DataTx_PropertyChanged;

问题在于,当我更改DataRx对象的任何DataClass属性时,DataRx_PropertyChangedDataTx_PropertyChanged方法都被激活,而不仅仅是DataRx_PropertyChanged被激活了。

如何仅在所需对象上激活事件?

编辑:

接口实现如下:

public event PropertyChangedEventHandler PropertyChanged;
protected bool SetProperty<T>(ref T field, T value, [CallerMemberName]string name = null)
{
    if (Equals(field, value))
    {
        return false;
    }
    field = value;
    OnPropertyChanged(name);
    return true;
 }  
 protected void OnPropertyChanged([CallerMemberName]string name = null)
 {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
 }

1 个答案:

答案 0 :(得分:0)

您可能正在声明PropertyChangedEventHandler静态。

INotifyPropertyChanged接口的正确实现应类似于以下内容:

private string myProperty;

public event PropertyChangedEventHandler PropertyChanged;

// This method is called by the Set accessor of each property.
// The CallerMemberName attribute that is applied to the optional propertyName
// parameter causes the property name of the caller to be substituted as an argument.
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

public string MyProperty
{
    get
    {
        return myProperty;
    }
    set
    {
        if (myProperty != value)
        {
            myProperty = value;
            NotifyPropertyChanged();
        }
    }
}