简单的改造一下,可以使ObservableCollection在任何有新成员加入的时候(注意包括已有成员被替换的情况),需要有一个事件进行通知,同时可以设置是否允许该新元素被加入。

 

原理很简单,利用INotifyCollectionChanged接口的相关事件,来判断新元素,然后出发自己的事件通知,最后根据事件EventArgs决定是否删除这个新元素。

 

代码:

//+ using System.Collections.ObjectModel;

//+ using System.Collections.Specialized;

class MyObserlist<T> : ObservableCollection<T>

{

    //INotifyCollectionChanged的CollectionChanged事件

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)

    {

        base.OnCollectionChanged(e);

 

        if (e.Action == NotifyCollectionChangedAction.Add || e.Action ==NotifyCollectionChangedAction.Replace)

        {

            var item = (T)e.NewItems[0];

            OnItemAdded(new ItemAddedEventArgs<T>(item), e.NewStartingIndex);

        }

    }

 

    //元素添加的事件

    public event EventHandler<ItemAddedEventArgs<T>> ItemAdded;

 

    protected virtual void OnItemAdded(ItemAddedEventArgs<T> e, int index)

    {

        var handler = this.ItemAdded;

        if (handler != null)

            handler(this, e);

 

        if (e.IsCancelled)

            RemoveAt(index);

    }

}

 

class ItemAddedEventArgs<T> : EventArgs

{

    //目标元素

    public T Item { getprivate set; }

    //是否取消添加操作,默认当然是否

    public bool IsCancelled { getset; }

 

    public ItemAddedEventArgs(T item)

    {

        Item = item;

    }

}

 

 

使用示例,创建一个简单的ObservableCollection,并且禁止所有偶数被添加进去:

static void Main(string[] args)

{

    var list = new List<int>();

    var collec = new MyObserlist<int>();

    collec.ItemAdded += collec_ItemAdded;

 

    //加入成功

    collec.Add(1);

    //禁止加入

    collec.Add(2);

    //将1改成4,加入失败,此时collec中没有任何元素

    collec[0= 4;

 

    Console.WriteLine("Count: " + collec.Count);

 

}

 

//偶数不会被加入

static void collec_ItemAdded(object sender, ItemAddedEventArgs<int> e)

{

    if (e.Item % 2 == 0)

    {

        e.IsCancelled = true;

        Console.WriteLine("{0}被取消", e.Item);

    }

    else

        Console.WriteLine("{0}被加入", e.Item);

 

}

 

输出:

1被加入

2被取消

4被取消

Count: 0