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

本文关键字:集合 观察 事件 操作 共享 处理 自己 | 更新日期: 2023-09-27 18:33:36

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

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

我在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));