2010-09-26 31 views
0

這是關於msdn的教程。這是用來關閉工作區或選項卡的。有關MVVM教程的問題:關閉工作區/ Observable Collection

// workspaces declared as follows 
_workspaces = new ObservableCollection<WorkspaceViewModel>(); 
_workspaces.CollectionChanged += this.OnWorkspacesChanged; 

void OnWorkspacesChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    if (e.NewItems != null && e.NewItems.Count != 0) 
     foreach (WorkspaceViewModel workspace in e.NewItems) 
      workspace.RequestClose += this.OnWorkspaceRequestClose; 

    if (e.OldItems != null && e.OldItems.Count != 0) 
     foreach (WorkspaceViewModel workspace in e.OldItems) 
      workspace.RequestClose -= this.OnWorkspaceRequestClose; 
} 

什麼,我不明白是什麼將e.NewItemse.OldItems是。假設NewItems將是添加到集合中的新項目,我附加了事件處理程序?但那麼它會是單數的,因爲我通常每次添加1個項目?那麼如果它意味着更改後仍然存在的所有項目,爲什麼我需要重新附加事件處理程序?

回答

0

該方法用於處理NotifyCollectionChanged事件 - 可以是「添加」,「移動」,「移除」,「替換」或「重置」操作。即項目被添加到集合或從集合中刪除(等)。

  • NewItems是在變化的invoved新項目的列表。
  • OldItems是受替換,移除或移動操作影響的項目列表。

所以,換句話說,當你添加一個視圖模型到集合中,「OnWorkspaceRequestClose」處理程序被連接到這一點新的視圖模型的「RequestClose」事件。

如果添加其他視圖模型(一個或多個),然後處理程序被附加到新的一個(或多個),但集合中的現有項目不會受到影響......

順便說一句,下半場的方法是爲正在關閉的ViewModel刪除OnWorkspaceRequestClose事件處理程序(以防止內存泄漏)