2011-11-29 115 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)); 
    } 


}