2011-11-29 106 views
2

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

如果他们失败了,我想不要将项目添加到集合或从集合中删除。看看这个名字,看起来集合改变的事件在添加或删除了一些东西后被触发,但是我怎么能实现我的功能呢?

回答

-1

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

-1

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

+0

不工作时,该列表是只读的。 – Eric

0

我将分享我为我的WPF/MVVM解决方案提供的家常黑客。在我要求的e.Action == NotifyCollectionChangedAction.Removee.Action == NotifyCollectionChangedAction.Add的方法中,我检查失败并采取任何必要的操作撤销更改并将布尔成员_updateObservable设置为true。由于我无法在更改事件期间修改ObservableCollection,因此我必须推迟它。设置布尔值似乎是最简单的事情。

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

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)); 
    } 


}