【问题标题】:Automatically Raise PropertyChanged when an inner object property got changed当内部对象属性发生更改时自动引发 PropertyChanged
【发布时间】:2011-01-26 14:43:42
【问题描述】:

我有这样的场景

Class Parent 
{
    Property  A;
 }

 Class A 
 {
      Property X
 }

当 X 发生变化时,如何在属性 A 上获得 PropertyChangedNotification?我不想在 A 类或任何破坏我脱钩的事件中提及“父母”。我基本上想要的是制作Parent.IsDirty==true。这是我故事的一个非常简化的版本,我有几十个像 Parent 这样的类,所以我正在寻找一些通用的方法来处理这个问题。

请注意,这不是实际代码。我得到了所有INotifyPropertyChanged 的实现。我只是想知道任何简单的机制,比如RaisePropertyChanged("A.X")

【问题讨论】:

    标签: c# wpf mvvm inotifypropertychanged


    【解决方案1】:

    你可以尝试在父类中注册propertychanged事件。在构造函数中,您可以订阅事件:

    public Parent()
    {
        A.OnPropertyChanged += OnAPropertyChanged;
    }
    
    void OnAPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "X")
            if(PropertyChanged != null)
                 PropertyChanged(this, new PropertyChangedEventArgs("A"))
    }
    

    希望这会有所帮助...

    【讨论】:

    • 我正在选择这个答案,但我觉得 MVVM 信使模式是我正在寻找的。​​span>
    【解决方案2】:

    我不知道这是否是最佳做法,但是: 像这样的东西呢:

    private Movie movie;
    public Movie Movie
    {
        get { return movie; }
        set
        {
            var oldProperties = typeof(Movie).GetProperties();
            foreach (var property in oldProperties)
            {
                if (property.GetValue(movie).GetHashCode() != value.GetType().GetProperty(property.Name).GetValue(value).GetHashCode())
                {
                    RaisePropertyChanged(property.Name);
                }
            }
    
            movie = value;
    
        }
    }
    

    当然,您可以将它带到外部帮助器,该帮助器获取 2 个对象和事件处理程序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多