gpt4 book ai didi

c# - 如何为 INotifyPropertyChanged 接口(interface)创建自己的 PropertyChangedEventArgs?

转载 作者:行者123 更新时间:2023-12-03 10:53:46 25 4
gpt4 key购买 nike

我遇到了一个问题,我在 DataModel 之间陷入无限循环。和 ViewModelPropertyChanged 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");
}
}
}

两个 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);
}
}
}

所以现在当 propertyDataModel 中设置, ViewModelBase 中的监听器捕获它并更新相关的 propertyViewModel .但是 ViewModel 中的设置将其设置回 DataModel有原因 OnPropertyChanged("SomeProperty");再次开火,以无限循环结束。
  • 有没有快速的解决方法来解决它? ( 注意 : 不能改变结构)
  • 我能否创建自己的自定义类,继承自 PropertyChangedEventArgs还有我的INotifyPropertyChanged运营工作?

  • 我刚在想:
    public class CustomPropertyChangedEventArgs : PropertyChangedEventArgs
    {
    public CustomPropertyChangedEventArgs(string propertyName, SomeEnum enumName)
    : base(propertyName)
    {
    //Set enum
    }
    }

    然后在 OnPropertyChanged我想使用新的 CustomPropertyChangedEventArgs并通过 enum在那我想用。
    public void OnPropertyChanged(string propertyName)
    {
    CustomPropertyChangedEventArgs handler = this.PropertyChanged;

    if (handler != null)
    {
    handler(this, new CustomPropertyChangedEventArgs(propertyName, newEnum));
    }
    }

    最佳答案

    您可以检查该值是否相同并且不要更新它。这通常是 INotifyPropertyChanged被实现。你解雇了OnPropertyChanged仅当它 真的改变了。

    public object SomeProperty
    {
    get
    {
    return SomeDataModel.SomeProperty;
    }
    set
    {
    if (SomeDataModel.SomeProperty != value)
    {
    SomeDataModel.SomeProperty = value;
    OnPropertyChanged("SomeProperty");
    }
    }
    }

    关于c# - 如何为 INotifyPropertyChanged 接口(interface)创建自己的 PropertyChangedEventArgs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11990801/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com