【问题标题】:Raise PropertyChanged event on a specific object在特定对象上引发 PropertyChanged 事件
【发布时间】:2018-06-21 11:09:42
【问题描述】:

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

【问题讨论】:

  • 当在 DataClass 的一个实例上设置属性触发另一个实例的 PropertyChanged 事件时,您的实现有问题。

标签: c# wpf mvvm data-binding


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多