首页 > 解决方案 > 在特定对象上引发 PropertyChanged 事件

问题描述

所以我有一个类(称为 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));
 }

标签: c#wpfmvvmdata-binding

解决方案


您可能将 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();
        }
    }
}

推荐阅读