属性不断变化的对象的可观察列表

本文关键字:观察 列表 对象 属性 变化 | 更新日期: 2023-09-27 18:14:02

我有一个项目层次结构,如下所示:

MainClass
{
    List<Configuration> MyList = new List<Configuration>;
}
Configuration
{
    CustomObject MyObject = new CustomObject;
    string Property = "";
}
CustomObject
{
    string InnerProperty = "";
}

如果我希望MainClass从对InnerPropertyProperty的每次更改中得到通知,那么我是否正确地假设我必须将List转换为ObservableCollection,并且ConfigurationCustomObject都应该从INotifyPropertyChanged派生,对吗?

如果我只想在InnerProperty更改时得到通知,而不是Property,那么CustomObject也应该从INotifyPropertyChangedConfiguration派生吗(因为我会丢失向父级的通知传输(?

属性不断变化的对象的可观察列表

要获得关于InnerProperty和Property的通知,通常不需要ObservableCollection。ObservableCollection仅用于有关已添加''已删除项目的通知。因此,您需要在Configuration和CustomObject上实现INotifyPropertyChanged。如果您只对InnerProperty的更改感兴趣,则在配置时不需要INotifyPropertyChanged,以防您的MyObject属性从未更改并在构造函数中分配。否则,您需要再次在两者上实现INotifyPropertyChanged。顺便说一句,ObservableCollection也是如此——如果你的列表包含固定的项目列表,那么你不需要它来接收来自属性的通知。否则你会这样做。

如果我只想在InnerProperty更改时得到通知,而不是Property,那么CustomObject也应该从INotifyPropertyChanged或CustomObject派生吗(因为我会丢失向父级的通知传输(?

(我假设这句话中的第二个CustomObject实际上是指Configuration。(

如果您只更改InnerProperty,而MyProperty没有更改,那么您只需要让CustomObject实现INotifyPropertyChanged。没有变化向上传播的感觉。

如果您有绑定路径:

{Binding Path=A.B.C.D}

然后,如果这些属性中的任何一个发生了更改,并且您希望更新绑定,那么相关级别必须实现INotifyPropertyChanged。如果一个属性是不可变的(没有更改(,那么就没有必要支持更改通知。您可以认为绑定正在侦听通过计算绑定路径返回的每个对象上的更改。

我将尝试回答您的概念问题。但代码很好。。。

我将首先指出C#::何时使用事件或从事件处理接口派生的对象集合?,我认为这很有帮助。

ObservableCollection负责在添加或删除项目时引发事件。不需要自动存在的INotifyPropertyChanged。如果您绑定到XAML中的ObservableCollection,那么您的XAML将注册这些事件,您不需要自己做任何事情。但是,除非您注册,否则没有其他人在监听这些事件。你可以这样做:

myObservablecollection.CollectionChanged += myHandler;

但我不认为这是你想要的。如果你现在想在MainClass.MyList中添加或删除某些内容,那么将其设置为ObservableCollection就可以了。但您想知道列表中的某个特定项目何时被修改,而ObservableCollection对此没有帮助。

假设您希望Configuration在其CustomObject发生更改时执行某些操作。也许它将Property(不是一个好名字?(设置为MyObject.ToString()。然后让CustomObject实现INotifyPropertyChanged,如下所示:

Class CustomObject : INotifyPropertyChanged
{
    private string _innerProperty;
    public string InnerProperty 
      {get { return _innerProperty; }
      {set 
         {
              _innerProperty = value;
              OnPropertyChanged("InnerProperty");
         }
      }
      public event PropertyChangedEventHandler PropertyChanged;
      public void OnPropertyChanged(PropertyChangedEventArgs e)
      {
         if (PropertyChanged != null)
        {
           PropertyChanged(this, e);
        }
      }
}

然后在配置中:

Class Configuration
{
    ...
    public Configuration(...)
    {
       ... // set up stuff
       MyObject.PropertyChanged += myObjectChanged_DoSomethingAboutIt;
    }
    private void myObjectChanged_DoSomethingAboutIt()
    {
         DoSomething();
         // for example:
         Property = MyObject.ToString();
    }
}

我希望这能有所帮助。更多信息:http://www.codeproject.com/Articles/41817/Implementing-INotifyPropertyChanged