2010-09-26 84 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事件处理程序(以防止内存泄漏)