如何为INotifyPropertyChanged接口创建自己的PropertyChangedEventArgs?

Wil*_*lem 0 .net c# events class mvvm

我所遇到的一个问题,我在我之间的无限循环获取DataModelViewModel使用PropertyChanged event.

我的结构:

public class SomeDataModel : DataModelBase
{
    public SomeDataModel()
    {

    }

    public object SomeProperty
    {
        get
        {
            //
        }
        set;
        {
            //
            OnPropertyChanged("SomeProperty");
        }
    }

    public bool SomeMethod()
    {
        SomeProperty = SomeNewObject
    }
}

public class SomeViewModel : ViewModelBase
{
    public SomeViewModel()
    {

    }

    public SomeDataModel SomeDataModel
    {
        get;
        set;
    }

    public object SomeProperty
    {
        get
        {
            return SomeDataModel.SomeProperty;
        }
        set
        {
            SomeDataModel.SomeProperty = value;
            OnPropertyChanged("SomeProperty");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

两者ViewModelDataModel实现INotifyPropertyChanged.

然后我listener在我ViewModelBase的任何property改变我的DataModel:

private void DataModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    PropertyInfo toPropertyInfo = this.GetType().GetProperty(e.PropertyName);
    PropertyInfo fromPropertyInfo = DataModel.GetType().GetProperty(e.PropertyName);

    if (toPropertyInfo != null && fromPropertyInfo != null)
    {
        if (toPropertyInfo.CanWrite && fromPropertyInfo.CanRead)
        {
            toPropertyInfo.SetValue(this, fromPropertyInfo.GetValue(DataModel, null), null);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,现在当property在被设置DataModel在监听器ViewModelBase捕获它,并更新相关propertyViewModel.但是它在集合中的ViewModel设置DataModel会导致OnPropertyChanged("SomeProperty");激发agian,以无限循环结束.

  1. 有快速解决方法吗?(注意:不能改变结构)
  2. 我是否能够创建自己的自定义类,继承PropertyChangedEventArgs并仍然可以INotifyPropertyChanged运行我的操作?

我刚在想:

public class CustomPropertyChangedEventArgs : PropertyChangedEventArgs
{
    public CustomPropertyChangedEventArgs(string propertyName, SomeEnum enumName)
        : base(propertyName)
    {
        //Set enum
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在OnPropertyChanged我想要使​​用新的CustomPropertyChangedEventArgs并传递enum我想要使​​用的内容.

public void OnPropertyChanged(string propertyName)
{
    CustomPropertyChangedEventArgs handler = this.PropertyChanged;

    if (handler != null)
    {
        handler(this, new CustomPropertyChangedEventArgs(propertyName, newEnum));
    }
}
Run Code Online (Sandbox Code Playgroud)

Ami*_*ach 5

您可以检查值是否相同,不要更新它.这是通常INotifyPropertyChanged的实施方式.OnPropertyChanged如果真的发生变化,你只会发射它.

public object SomeProperty
{
    get
    {
        return SomeDataModel.SomeProperty;
    }
    set
    {
        if (SomeDataModel.SomeProperty != value)
        {
            SomeDataModel.SomeProperty = value;
            OnPropertyChanged("SomeProperty");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)