具有更改属性的对象的可观察列表

时间:2015-09-23 11:45:11

标签: c# wpf events collections

我有以下项目的层次结构:

customFields

如果我希望通过对MainClass { List<Configuration> MyList = new List<Configuration>; } Configuration { CustomObject MyObject = new CustomObject; string Property = ""; } CustomObject { string InnerProperty = ""; } MainClass所做的每次更改通知InnerProperty,我是否认为必须将Property转换为{{}} {1}}并且ListObservableCollection都应来自Configuration,对吗?

如果我只希望在CustomObject更改时收到通知,而不是INotifyPropertyChanged,那么InnerProperty PropertyCustomObject也只能来自INotifyPropertyChanged。既然我会失去通知父母的通知??

3 个答案:

答案 0 :(得分:2)

要获得有关InnerProperty和Property的通知,您通常不需要ObservableCollection。 ObservableCollection仅用于添加\删除项目的通知。因此,您需要在Configuration和CustomObject上实现INotifyPropertyChanged。如果您只对InnerProperty的更改感兴趣,则在您的MyObject属性永远不会更改并在构造函数中分配时,不需要在Configuration上使用INotifyPropertyChanged。否则,您需要再次在两者上实现INotifyPropertyChanged。顺便说一下ObservableCollection的相同故事 - 如果您的列表包含固定的项目列表 - 您不需要它来接收来自属性的通知。否则你会这样做。

答案 1 :(得分:1)

  

如果我只想在InnerProperty被更改时获取通知,而不是属性,那么只有CustomObject也可以从INotifyPropertyChanged或CustomObject派生(因为我会丢失通知传输给父级)?

(我假设对于该句中的第二个CustomObject,您实际上是指Configuration。)

如果您只更改InnerPropertyMyProperty没有更改,那么您只需要CustomObject实施INotifyPropertyChanged。没有任何变化感传播到链条上。

如果您有绑定路径:

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

然后,如果其中任何属性发生更改并且您希望更新绑定,则相关级别必须实现INotifyPropertyChanged。如果属性是不可变的(不会发生变化),那么就不需要支持变更通知。您可以认为绑定正在侦听通过绑定路径评估返回的每个对象的更改。

答案 2 :(得分:1)

我会尝试回答你的概念问题。但代码很好......

我首先只指向C#:: When to use events or a collection of objects derived from an event handling Interface?,我觉得这很有帮助。

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

myObservablecollection.CollectionChanged += myHandler;

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

假设您希望ConfigurationCustomObject更改时执行某些操作。也许它将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