C# 关于MVVM教程的问题:关闭工作空间/可观察集合

C# 关于MVVM教程的问题:关闭工作空间/可观察集合,c#,mvvm,C#,Mvvm,这与上的教程有关。这是用来关闭工作区或选项卡的 // workspaces declared as follows _workspaces = new ObservableCollection<WorkspaceViewModel>(); _workspaces.CollectionChanged += this.OnWorkspacesChanged; void OnWorkspacesChanged(object sender, NotifyCollectionChangedE

这与上的教程有关。这是用来关闭工作区或选项卡的

// 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;
}
//工作区声明如下
_工作空间=新的ObservableCollection();
_workspaces.CollectionChanged+=this.OnWorkspacesChanged;
void OnWorkspacesChanged(对象发送方,NotifyCollectionChangedEventArgs e)
{
如果(e.NewItems!=null&&e.NewItems.Count!=0)
foreach(e.NewItems中的WorkspaceViewModel工作空间)
workspace.RequestClose+=this.OnWorkspaceRequestClose;
如果(e.OldItems!=null&&e.OldItems.Count!=0)
foreach(e.OldItems中的WorkspaceViewModel工作空间)
workspace.RequestClose-=this.OnWorkspaceRequestClose;
}

我不明白的是
e.NewItems
e.OldItems
将是什么。假设
NewItems
将是添加到集合中的新项,我是否附加事件处理程序?但它将是单数的,因为我通常一次添加1项?那么,如果这意味着更改后仍将存在所有项目,为什么我需要重新附加事件处理程序?

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

  • NewItems
    是变更中涉及的新项目的列表
  • OldItems
    是受替换、删除或移动操作影响的项目列表
因此,换句话说,当您将ViewModel添加到集合中时,“
OnWorkspaceRequestClose
”处理程序将附加到新ViewModel的“RequestClose”事件

如果添加其他ViewModel,则处理程序将附加到新的ViewModel,但集合中的现有项不会受到影响

顺便说一句,该方法的后半部分是删除正在关闭的ViewModels的
OnWorkspaceRequestClose
事件处理程序(以防止内存泄漏)