取消集合已更改事件的可观察集合

时间:2011-11-29 09:01:40

标签: c# events collections

如何取消可观察集合上的集合更改事件? 当我的集合发生变化时,它会调用第三方dll上的方法。这些方法可能会也可能不会失败。

如果它们失败了,我希望不要将该项目添加到集合中或从集合中删除。看一下这个名字,看起来像是在添加或删除了某些内容后触发了集合更改事件,但是我怎样才能实现我的功能呢?

4 个答案:

答案 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.Removee.Action == NotifyCollectionChangedAction.Add的方法中,我检查失败并采取撤消更改所需的任何操作并将布尔成员_updateObservable设置为true。由于我无法在更改事件期间修改ObservableCollection,因此我必须推迟它。设置布尔值似乎是最简单的事情。

然后在视图模型中,我有一个属性,用于绑定observable上的选定项。我添加到该属性get方法if (_updateObservable) UpdateObservable();即使添加或删除的项目不直接影响所选项目,所选项目绑定属性也会始终触发其getter。 UpdateObservable()添加或删除集合中所需的任何项,并将标志设置为false。

答案 2 :(得分:-1)

您可以使用新命令覆盖该特定方法。

答案 3 :(得分:-1)

如果您可以设法在代码中处理该事件,NotifyCollectionChangedEventArgs.NewItems会返回更改中涉及的IList个新项目。如果第三方dll中的方法失败,您可以从集合中删除这些项目。