2012-02-16 10 views
3

在使用MVVM我的Silverlight應用程序,我有一個圖表(第三方的ComponentOne)圖表龐大的數據,因此花費的時間來呈現良好的金額。在MVVM在視圖模型做批量修改時,如何使用配料,類似的BeginUpdate/EndUpdate,?

我有一個ObservableCollection(比如chartDataCollection),在我的ViewModel中,它綁定到圖表的數據源。

在某些場景中,我在chartDataCollection中添加了100個項目,導致CollectionChange事件被激發100次,並且每次渲染圖表都需要很多時間。

無論如何,C#中我可以將這些更新分組在一起,並在我完成時只通知一次UI?喜歡的東西,我們習慣於在世界的WinForms,同時增加數據使用的BeginUpdate和EndUpdate報表數據網格。

回答

2

要實現的接口是INotifyCollectionChanged。參數此事件(NotifyCollectionChangedEventArgs)可以報告說,已經改變了項目的批次 - 此接口與WPF通過CollectionChanged事件綁定通信。

這樣做的一種方法是實現自己的MyBatchObservableColleciton,派生或(更好)嵌入列表(或任何其他適當的集合)。實現方法來修改innter集合並記錄所有這些更改。當您準備將所有更改提交到WPF時,只需發送更改列表。這裏是你可以做什麼(僅適用於實施「添加」 funcitonality到您的收藏)的一個子集例如:

class BatchObservableColleciton<T> : INotifyCollectionChanged, IEnumerable 
{ 
    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    private List<T> _list; 
    private List<T> _addedItems; 

    public BatchObservableColleciton() { 
     _list = new List<T>(); 
     _addedItems = new List<T>(); 
    } 

    public IEnumerator GetEnumerator() 
    { 
     return _list.GetEnumerator(); 
    } 

    public void Add(T item) 
    { 
     _list.Add(item); 
     _addedItems.Add(item); 
    } 

    public void commit() { 
     if(CollectionChanged != null) { 
      CollectionChanged(this, new NotifyCollectionChangedEventArgs(
       NotifyCollectionChangedAction.Add, _addedItems)); 
     } 
     _addedItems.Clear(); 
    } 

} 

從來沒有嘗試過自己,但我認爲這是一段路要走。 Google for Custom & ObservableCollection。雖然不是確切的,但在那裏幾乎沒有實現。

0

而不是使用ObservableCollection,使用簡單的IEnumerable屬性利用INotifyPropertyChanged模式。

private IEnumerable _ChartDataCollection; 
public IEnumerable ChartDataCollection 
{ 
    get 
    { 
     return _ChartDataCollection; 
    } 
    set 
    { 
     if (_ChartDataCollection != value) 
     { 
      _ChartDataCollection = value; 
      NotifyPropertyChanged("ChartDataCollection"); 
     } 
    } 
} 
+0

這是錯誤的答案。除IEnumerable之外,您必須實現INotifyCollectionChanged – Uri 2012-02-16 08:30:33

+0

不,它會起作用,只需將每個添加/刪除的整個ChartDataCollection屬性重置爲圖表數據源 – 2012-02-27 15:33:45

+0

@Uri INotifyCollectionChanged顯示OP所具有的問題。儘管您的解決方案有效,但它架構過度。我的解決方案有效,而且更簡單。 – 2012-02-27 21:51:12

0

爲什麼不使用一個單獨的集合所有的變化,然後合併兩個集合,它一旦你完成分配給您的公共收藏?這隻會觸發一次PropertyChanged事件。

// Create a new List that contains objects from your Collection 
var list = new List<SomeItem>(SomeCollection); 

foreach(var item in newItems) 
{ 
    // Add new items to list 
} 

// Reset collection w/ items from List 
SomeCollection = new ObservableCollection<SomeItem>(list);