如何取消可觀察集合上收集已更改事件? 當我的集合更改時,它會調用第三方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