关于MVVM教程的问题:关闭工作区/可观察集合

时间:2010-09-26 01:34:42

标签: c# mvvm

这是关于msdn的教程。这是用于关闭工作区或选项卡的内容。

// 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项?那么如果它意味着更改后仍然存在的所有项目,为什么我需要重新附加事件处理程序?

1 个答案:

答案 0 :(得分:0)

该方法用于处理NotifyCollectionChanged事件 - 它可以用于“添加”,“移动”,“移除”,“替换”或“重置”操作。即,正在向集合中添加或删除项目(等)。

  • NewItems是更改中隐含的项目的列表。
  • OldItems是受“替换”,“移除”或“移动”操作影响的项目列表。

换句话说,当您将ViewModel添加到集合中时,“OnWorkspaceRequestClose”处理程序将附加到该新ViewModel的“RequestClose”事件。

如果您添加另一个ViewModel,则处理程序将附加到新的ViewModel,但集合中的现有项目不会受到影响......

顺便提一下,该方法的后半部分是为那些正在关闭的ViewModel删除OnWorkspaceRequestClose事件处理程序(以防止内存泄漏)