如何取消可观察集合上收集已更改事件? 当我的集合更改时,它会调用第三方dll上的方法。这些方法可能会也可能不会失败。在可观察集合上取消收集已更改事件
如果他们失败了,我想不要将项目添加到集合或从集合中删除。看看这个名字,看起来集合改变的事件在添加或删除了一些东西后被触发,但是我怎么能实现我的功能呢?
如何取消可观察集合上收集已更改事件? 当我的集合更改时,它会调用第三方dll上的方法。这些方法可能会也可能不会失败。在可观察集合上取消收集已更改事件
如果他们失败了,我想不要将项目添加到集合或从集合中删除。看看这个名字,看起来集合改变的事件在添加或删除了一些东西后被触发,但是我怎么能实现我的功能呢?
您可以简单地使用新命令覆盖该特定方法。
如果您可以设法处理代码中的事件,则NotifyCollectionChangedEventArgs.NewItems
会返回IList
中涉及变更的新项目。如果第三方DLL中的方法失败,则可以从集合中删除这些项目。
我将分享我为我的WPF/MVVM解决方案提供的家常黑客。在我要求的e.Action == NotifyCollectionChangedAction.Remove
或e.Action == NotifyCollectionChangedAction.Add
的方法中,我检查失败并采取任何必要的操作撤销更改并将布尔成员_updateObservable
设置为true。由于我无法在更改事件期间修改ObservableCollection,因此我必须推迟它。设置布尔值似乎是最简单的事情。
然后在视图模型中,我有一个属性用于绑定observable上的选定项目。我添加到该属性获取方法if (_updateObservable) UpdateObservable();
即使添加或删除的项目不直接影响所选项目,似乎选定项目绑定属性始终会激发其获取方法。 UpdateObservable()添加或删除集合中所需的所有项目,并将该标志设置为false。
为时已晚,但它可能会帮助别人:
class ExtendedObservableCollection<T> : ObservableCollection<T>
{
private bool _suppressNotification = false;
public bool AllowNotifications { get { return _suppressNotification; } }
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (!_suppressNotification)
base.OnCollectionChanged(e);
}
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (!_suppressNotification)
base.OnPropertyChanged(e);
}
public void ActivateNotifications()
{
_suppressNotification = false;
}
public void DesactivateNotifications()
{
_suppressNotification = true;
}
public void AddRange(IEnumerable<T> list)
{
if (list == null)
throw new ArgumentNullException("list");
_suppressNotification = true;
foreach (T item in list)
{
Add(item);
}
_suppressNotification = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add));
}
}
不工作时,该列表是只读的。 – Eric