2012-02-20 82 views
0

ObservableCollection提供CollectionChanged事件我們添加,刪除或更新集合中的項目,但它引發了單個項目更改的事件,例如,每當將新項目添加到集合時,它將引發集合。CollectionChanged事件

現在,我想要的是在完成對集合的所有修改後引發事件,例如,我需要添加2個項目,刪除一個項目並更新2個項目。 CollectionChanged事件應該只在完成所有這些添加,刪除和更新之後觸發。

或者,假設我有一個新的集合所有的修改,現在,我想提出的CollectionChanged當我給你新的集合,例如:

ObservableCollection<string> mainCollection; //assume it has some items 
mainCollection = updatedCollection; // at this point I want to raise the event. 

請提供您寶貴的建議。

問候,

BHavik

回答

1

看起來你寧願看着賦值給變量mainCollection而不是關火的ObservableCollection類的事件。事情是這樣的:

 private ObservableCollection<MyItemType> _mainCollection; 
     public ObservableCollection<MyItemType> MainCollection 
     { 
      get 
      { 
       return _mainCollection; 
      } 
      set 
      { 
       _mainCollection = value; 
       TriggerMyEvent(); // do whatever you like here 
      } 
     } 
+0

我不想提出我自己的事件,我只想使用ObservableColleciton的CollectionChangedEvent。 – 2012-02-20 05:20:21

+0

@RaoBHavik:你所要求的是不可能的。 – 2012-02-20 05:26:21

+0

我可以選擇其他選項而不是ObservableColleciton它可以滿足我的要求。 – 2012-02-20 05:26:26

2

它不會工作,你寫的方式,原因是您訂閱mainCollection對象的事件,然後用整個另一個對象只是相同的變量名referencng它替換它。你不必指定集合,但以更新的集合中的所有元素添加到主集合

編輯: 的AddRange的的ObservableCollection:

using System.Collections.Specialized; 
using System.Collections.Generic; 

namespace System.Collections.ObjectModel 
{ 

/// <summary> 
/// Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed. 
/// </summary> 
/// <typeparam name="T"></typeparam> 
public class ObservableCollection<T> : System.Collections.ObjectModel.ObservableCollection<T> 
{ 

    /// <summary> 
    /// Adds the elements of the specified collection to the end of the ObservableCollection(Of T). 
    /// </summary> 
    public void AddRange(IEnumerable<T> collection) 
    { 
     foreach (var i in collection) Items.Add(i); 
     OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add), collection.ToList()); 
    } 

    /// <summary> 
    /// Removes the first occurence of each item in the specified collection from ObservableCollection(Of T). 
    /// </summary> 
    public void RemoveRange(IEnumerable<T> collection) 
    { 
     foreach (var i in collection) Items.Remove(i); 
     OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove), collection.ToList()); 
    } 

    /// <summary> 
    /// Clears the current collection and replaces it with the specified item. 
    /// </summary> 
    public void Replace(T item) 
    { 
     ReplaceRange(new T[] { item }); 
    } 
    /// <summary> 
    /// Clears the current collection and replaces it with the specified collection. 
    /// </summary> 
    public void ReplaceRange(IEnumerable<T> collection) 
    { 
     List<T> old = new List<T>(Items); 
     Items.Clear(); 
     foreach (var i in collection) Items.Add(i); 
     OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace)); 
    } 

    /// <summary> 
    /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class. 
    /// </summary> 
    public ObservableCollection() 
     : base() { } 

    /// <summary> 
    /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class that contains elements copied from the specified collection. 
    /// </summary> 
    /// <param name="collection">collection: The collection from which the elements are copied.</param> 
    /// <exception cref="System.ArgumentNullException">The collection parameter cannot be null.</exception> 
    public ObservableCollection(IEnumerable<T> collection) 
     : base(collection) { } 
} 
} 

this question

+0

在這種情況下,它會爲每個我不想發生的添加語句引發CollectionChanged。 – 2012-02-20 06:26:16

+0

@RaoBHavik,我編輯了我的答案,AddRange方法調用的CollectionChange只有一次 – 2012-02-20 06:32:05

1

標準採取ObservableCollection<T>不支持這種情況。您可以使用您需要的邏輯創建一個實現INotifyCollectionChanged接口的類,例如,使用一種方法將所有項目替換爲另一個集合。

這可能對UI沒有好處,例如,如果選擇了集合綁定元素或將焦點集中,則如果完全重新初始化集合,則此狀態將會丟失。取決於你的情況。

+0

我不能在解決方案中添加我自己的集合。 – 2012-02-20 06:27:51

相關問題