C# 卸载父视图时,如何清理TabControl中的视图?

C# 卸载父视图时,如何清理TabControl中的视图?,c#,silverlight,prism,tabcontrol,C#,Silverlight,Prism,Tabcontrol,我有一个包含TabControl的视图(我称之为MainView)。组成选项卡项的视图是使用MainView的ViewModel中的prism创建的。当我使用tab控件时(即在MainView的unload事件期间),作为“选项卡”的每个视图都需要进行一些清理(分离事件处理程序等)。但是,我无法使用选项卡视图的“卸载的事件”进行清理,因为这是在切换选项卡时调用的 当unload触发时,MainView正在调用其ViewModel上的方法,但由于这些视图的注册方式,该ViewModel没有对组成选

我有一个包含TabControl的视图(我称之为MainView)。组成选项卡项的视图是使用MainView的ViewModel中的prism创建的。当我使用tab控件时(即在MainView的
unload
事件期间),作为“选项卡”的每个视图都需要进行一些清理(分离事件处理程序等)。但是,我无法使用选项卡视图的“卸载的<代码>事件”进行清理,因为这是在切换选项卡时调用的


unload
触发时,MainView正在调用其ViewModel上的方法,但由于这些视图的注册方式,该ViewModel没有对组成选项卡的视图或ViewModel的引用。“发现”选项卡视图后,什么是正确的清理方法?

我也有类似的情况,但我们使用的是Dock控件,其中视图是使用Prism加载的。因此,在卸载事件背后的Shell视图代码中,我们循环打开的视图并获得每个视图的ViewModel。我们所有的ViewModel都继承自一个基本ViewModel,该基础ViewModel具有一个虚拟bool CanClose方法,该方法返回视图是否可以关闭。基本视图模型只返回true。此方法用于检查是否存在验证错误、未保存的更改等。因此,您将覆盖此方法并执行所述的清理。如果所有视图都返回true,则可以调用主shell viewmodel unload,否则可以取消卸载主视图

foreach (var doc in dockManager.Documents)
{
    if (!doc.CanClose())
    {
        e.Cancel = true;
        return;
    }
}

我们最终通过EventAggregator使用了一条消息来清理子视图。

我在应用程序中使用了Prism导航,也遇到了同样的问题。 为了解决这个问题,在父视图模型的OnNavigatedFrom方法中,我关闭了TabControl区域中的所有视图:

public class ParentViewModel : INavigationAware
{
    ...
    public void OnNavigatedFrom(NavigationContext navigationContext)
            {
        var region = RegionManager.Regions["TabsRegion"];
        foreach (var view in region.Views)
            region.Remove(view);
    }
}

谢谢你的回复。最后,我使用EventAggregator模式向子视图发布父视图即将关闭的消息,并在此时执行任何清理。不过,您的解决方案似乎更加优雅。实际上,我们使用EventAggregator有一个ApplicationClosing事件,因此任何后台进程都可以准备关闭。我认为这也是一个很好的解决方案,只是不使用它来关闭打开的视图。