我有一个包含TabControl的视图(我称之为MainView)。构成TabItems的视图是使用MainView的ViewModel中的棱镜view discovery创建的。当我完成选项卡控件时(即在MainView的Unloaded
事件期间),每个作为“选项卡”的视图都需要进行一些清理(分离事件处理程序等)。但是,我不能使用Tab视图'Unloaded
事件进行清理,因为只在切换标签时会调用它。
当Unloaded
触发时,MainView正在其ViewModel上调用一个方法,但由于这些视图的注册方式,ViewModel没有对组成选项卡的Views或ViewModel的引用。在我的“已发现”标签视图后清理的正确方法是什么?
答案 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);
}
}