避免对共享的可观察集合的事件处理自己的操作

时间:2014-12-08 12:30:39

标签: c# wpf observablecollection

我有一个ObservableCollection,它在两个客户端类之间共享。 他们每个人都可以改变收藏。当它发生时,另一个类应该做一些 处理行动。 每个客户端类如何避免处理自己的操作?

1 个答案:

答案 0 :(得分:0)

我在CollectionChanged事件中看不到任何可以帮助您的内容。 sender只是集合本身,而NotifyCollectionChangedEventArgs也没有任何可用于此目的的信息。

我想你可以做的是在每个班级最初订阅CollectionChanged事件,所以如果添加了某些内容,他们就会准备好听。但是当你尝试从一个类或另一个类添加一个项目时,让他们先取消订阅该事件,添加或删除该项目,然后重新订阅它。

public class SomeClass
{
    ObservableCollection<int> myObservableColl = new ObservableCollection<int>();

    public SomeClass()
    {
        myObservableColl.CollectionChanged += MainWindowViewModel_CollectionChanged;
    }

    private void AddItem(int number)
    {
        myObservableColl.CollectionChanged -= MainWindowViewModel_CollectionChanged;
        myObservableColl.Add(number);
        myObservableColl.CollectionChanged += MainWindowViewModel_CollectionChanged;
    }

    private void MoveItem(int oldIndex, int newIndex)
    {
        myObservableColl.CollectionChanged -= MainWindowViewModel_CollectionChanged;
        myObservableColl.Move(oldIndex, newIndex);
        myObservableColl.CollectionChanged += MainWindowViewModel_CollectionChanged;
    }

    // etc, etc.
}

如果你不想制作一大堆方法,你可以这样定义一个:

private void ChangeCollectionWithoutNotification(Action action)
{
    myObservableColl.CollectionChanged -= MainWindowViewModel_CollectionChanged;
    action.Invoke();
    myObservableColl.CollectionChanged += MainWindowViewModel_CollectionChanged;
}

然后将动作传递给它:

ChangeCollectionWithoutNotification(() => myObservableColl.Add(5));

ChangeCollectionWithoutNotification(() => myObservableColl.Move(1, 2));