具有嵌套的observablecollection子树的树结构

时间:2014-04-22 10:21:57

标签: c# wpf events tree observablecollection

我的课程类似于以下

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项目和多个嵌套级别,如果没有更好的话,可以有这么多的事件监听器建议?

1 个答案:

答案 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无论如何都是管理这些事情的好方法,我认为它也是标准的。