这是关于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.NewItems
和e.OldItems
会是什么。假设NewItems
将是添加到集合中的新项目,我附加事件处理程序?但那么它会是单数,因为我通常一次添加1项?那么如果它意味着更改后仍然存在的所有项目,为什么我需要重新附加事件处理程序?
答案 0 :(得分:0)
该方法用于处理NotifyCollectionChanged
事件 - 它可以用于“添加”,“移动”,“移除”,“替换”或“重置”操作。即,正在向集合中添加或删除项目(等)。
NewItems
是更改中隐含的新项目的列表。OldItems
是受“替换”,“移除”或“移动”操作影响的项目列表。换句话说,当您将ViewModel添加到集合中时,“OnWorkspaceRequestClose
”处理程序将附加到该新ViewModel的“RequestClose”事件。
如果您添加另一个ViewModel,则处理程序将附加到新的ViewModel,但集合中的现有项目不会受到影响......
顺便提一下,该方法的后半部分是为那些正在关闭的ViewModel删除OnWorkspaceRequestClose
事件处理程序(以防止内存泄漏)