我的课程类似于以下
class ModelCollection : ObservableCollection<MyModel>
{
public ModelCollection ()
{
this.CollectionChanged += (s, e) =>
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
//do something
}
if(e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
//do something
}
};
}
//etc..
}
和MyModel类
public class MyModel
{
public int id {get;set;}
public string Name {get;set;}
public MyModel Parent {get;set;}
public ModelCollection Descendants {get;set;}
public ModelCollection Children {get;set;}
//etc..
}
一般来说,我有一个集合,其根MyModel具有MyModel类型的子节点,并且那些子节点具有该类型的子节点,并且它最多可以达到20个嵌套级别,因此它基本上是树结构。
正如你在ModelCollection中看到的,我有一个事件监听器,我的问题是,考虑到每个项目有数千个MyModel项目和多个嵌套级别,如果没有更好的话,可以有这么多的事件监听器建议?
答案 0 :(得分:1)
你可以使用so match事件监听器,但是你必须维护它。另外它可能导致内存泄漏。
另一个选择是在所有模型对象上使用INotifyPropertyChanged,例如:
public class MyModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public int id { get {...} set { OnPropertyChanged("id"); } }
public string Name { get {...} set { OnPropertyChanged("Name"); } }
public MyModel Parent { get {...} set { OnPropertyChanged("Parent"); } }
public ModelCollection Descendants { get {...} set { OnPropertyChanged("Descendants"); } }
public ModelCollection Children { get {...} set { OnPropertyChanged("Children"); } }
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
然后,您可以使用分层数据上下文和类似的WPF功能,这些功能可以利用INotifyPropertyChanged实现而无需您的任何工作。
另一个选择是继承DependencyObject并使用DependencyProperties而不是简单属性,WPF可以以类似的方式使用它们。但是我认为DependencyObject在非UI元素的情况下可能是一种过度杀伤,在这种情况下首选INotifyPropertyChanged。
更新:我注意到您没有提到由于UI原因需要ObservalbleCollection,所以我对WPF的评论可能是多余的。无论如何,我认为使用INotifyPropertyChanged无论如何都是管理这些事情的好方法,我认为它也是标准的。