避免处理自己对共享可观察集合的事件的操作
本文关键字:集合 观察 事件 操作 共享 处理 自己 | 更新日期: 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));