Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 关闭窗口时删除Prism中的ViewModels_Wpf_Prism_Unity Container - Fatal编程技术网

Wpf 关闭窗口时删除Prism中的ViewModels

Wpf 关闭窗口时删除Prism中的ViewModels,wpf,prism,unity-container,Wpf,Prism,Unity Container,我有一个winform应用程序,其中的数据网格行带有一些图标。 当用户单击其中一个图标时,将打开一个WPF窗口。 我已经使用Prism创建了这个WPF窗口,即它的外壳和区域映射到视图 我面临的问题是: 当我试图关闭WPF窗口时,出现异常“无法在窗口关闭后设置可见性或调用Show、ShowDialog或WindowInteropHelper.EnsureHandle” 我知道我们可以通过隐藏窗口而不是关闭窗口来解决问题。 然而,这使得我的ViewModel和服务代表了旧的WPF窗口。 我将静态计数

我有一个winform应用程序,其中的数据网格行带有一些图标。 当用户单击其中一个图标时,将打开一个WPF窗口。 我已经使用Prism创建了这个WPF窗口,即它的外壳和区域映射到视图

我面临的问题是: 当我试图关闭WPF窗口时,出现异常“无法在窗口关闭后设置可见性或调用Show、ShowDialog或WindowInteropHelper.EnsureHandle” 我知道我们可以通过隐藏窗口而不是关闭窗口来解决问题。 然而,这使得我的ViewModel和服务代表了旧的WPF窗口。 我将静态计数器保留在ViewModels中,并观察到每次打开WPF窗口时,静态计数都会增加,这意味着我的旧视图模型不会被破坏

我想知道如何正确处理这个场景,这样当我关闭窗口时,所有与窗口相关的东西都应该被处理掉。
我试着在ShellViewModel中执行container.dispose,但是仍然没有成功。

这里有两个方面。首先,您可以在视图模型上使用
regionmemberlifetime属性
,或者实现
IRegionMemberLifetime
,使Prism每次都创建一个新实例


其次,您必须创建自己的
RegionBehavior
(或从中获取)来创建Prism dispose视图模型。

您可以使用Prism提供的新IDialogService,我认为IDialogService主要用于替换MessageBox用例。在我的例子中,我在WPF上有一个相当复杂的UI,在一个shell中有3个区域。您可以使用自己的ViewModel、regions等组合IDialogService,并使用一个作用域管理器。否则,您将需要创建外壳服务-->这已经有了答案: