【问题标题】:Implementing INotifyCollectionChanged interface实现 INotifyCollectionChanged 接口
【发布时间】:2010-12-24 16:51:33
【问题描述】:

我需要实现一个具有特殊功能的集合。另外,我想把这个集合绑定到一个ListView上,所以我最终得到了下一个代码(我在论坛中省略了一些使它更短的方法):

public class myCollection<T> : INotifyCollectionChanged
{
    private Collection<T> collection = new Collection<T>();
    public event NotifyCollectionChangedEventHandler CollectionChanged;

    public void Add(T item)
    {
        collection.Insert(collection.Count, item);
        OnCollectionChange(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
    }

    protected virtual void OnCollectionChange(NotifyCollectionChangedEventArgs e)
    {
        if (CollectionChanged != null)
            CollectionChanged(this, e);
    }
}

我想用一个简单的数据类来测试它:

public class Person
{
    public string GivenName { get; set; }
    public string SurName { get; set; }
}

所以我创建了一个 myCollection 类的实例,如下所示:

myCollection<Person> _PersonCollection = new myCollection<Person>();
public myCollection<Person> PersonCollection
{ get { return _PersonCollection; } }

问题是虽然我实现了 INotifyCollectionChanged 接口,但集合更新时 ListView 没有更新。

我知道我的绑定很好(在 XAML 中),因为当我像这样使用 ObservableCollecion 类而不是 myCollecion 类时:

 ObservableCollection<Person> _PersonCollection = new ObservableCollection<Person>();
    public ObservableCollection<Person> PersonCollection
    { get { return _PersonCollection; } }

ListView 更新

有什么问题?

【问题讨论】:

    标签: wpf data-binding observablecollection inotifycollectionchanged


    【解决方案1】:

    为了让你的集合被消费,你也应该实现 IEnumerable 和 IEnumerator。虽然,你最好继承ObservableCollection&lt;T&gt;

    【讨论】:

    • 更好的是,实现IList&lt;T&gt;
    • 是的,或者继承自 Collection。 ObservableCollection 也实现了 INotifyPropertyChanged。
    • 问题是 ObservableCollection 有许多我不希望我的类的用户访问的公共方法,如果我继承 ObservableCollection 我无法控制.
    • 比如?从 ReadOnlyObservableCollection 继承呢? msdn.microsoft.com/en-us/library/ms668620.aspx
    • 例如,我希望集合以类似于队列的方式运行(仅将项目插入到集合的末尾并仅从集合的头部删除项目)。因此我想禁止使用:public void Insert(int index, T item);
    猜你喜欢
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多