如何取消可观察集合上的集合更改事件? 当我的集合发生变化时,它会调用第三方dll上的方法。这些方法可能会也可能不会失败。
如果它们失败了,我希望不要将该项目添加到集合中或从集合中删除。看一下这个名字,看起来像是在添加或删除了某些内容后触发了集合更改事件,但是我怎样才能实现我的功能呢?
答案 0 :(得分:1)
太晚了,但可能对其他人有所帮助:
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));
}
}
答案 1 :(得分:0)
我将分享我为WPF / MVVM解决方案提出的家常黑客攻击。在我调用e.Action == NotifyCollectionChangedAction.Remove
或e.Action == NotifyCollectionChangedAction.Add
的方法中,我检查失败并采取撤消更改所需的任何操作并将布尔成员_updateObservable
设置为true。由于我无法在更改事件期间修改ObservableCollection,因此我必须推迟它。设置布尔值似乎是最简单的事情。
然后在视图模型中,我有一个属性,用于绑定observable上的选定项。我添加到该属性get方法if (_updateObservable) UpdateObservable();
即使添加或删除的项目不直接影响所选项目,所选项目绑定属性也会始终触发其getter。 UpdateObservable()添加或删除集合中所需的任何项,并将标志设置为false。
答案 2 :(得分:-1)
您可以使用新命令覆盖该特定方法。
答案 3 :(得分:-1)
如果您可以设法在代码中处理该事件,NotifyCollectionChangedEventArgs.NewItems
会返回更改中涉及的IList
个新项目。如果第三方dll中的方法失败,您可以从集合中删除这些项目。