卸载父视图时,如何清除TabControl中的视图?

时间:2011-11-10 01:09:33

标签: c# silverlight prism tabcontrol

我有一个包含TabControl的视图(我称之为MainView)。构成TabItems的视图是使用MainView的ViewModel中的棱镜view discovery创建的。当我完成选项卡控件时(即在MainView的Unloaded事件期间),每个作为“选项卡”的视图都需要进行一些清理(分离事件处理程序等)。但是,我不能使用Tab视图'Unloaded事件进行清理,因为只在切换标签时会调用它。

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

3 个答案:

答案 0 :(得分:1)

我有类似的情况,但我们正在使用Dock控件,其中使用Prism加载视图。因此,在卸载事件后面的Shell Views代码中,我们遍历打开的Views并获取每个视图的ViewModel。我们所有的ViewModel都从一个基础ViewModel继承,该ViewModel具有一个虚拟bool CanClose方法,该方法返回视图是否可以关闭。基本ViewModel只返回true。此方法用于检查是否存在验证错误,未保存的更改等。因此,您将覆盖此方法并执行清理您的讨论。如果所有视图都返回true,那么你可以调用main shell viewmodel unload,如果没有,那么你可以从卸载中取消主视图。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我在我的应用程序中使用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);
    }
}