Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
C# 关闭和清理ViewModel中的视图_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 关闭和清理ViewModel中的视图

C# 关闭和清理ViewModel中的视图,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我的应用程序使用著名的IDialogService的变体创建了许多子视图。现在,我需要在特定事件或一组事件发生时,以编程方式关闭这些视图 首先,我应该如何最好地揭示观点的封闭方法,记住 必须释放视图的DataContext(ViewModel)并 必须为每个要关闭的视图调用View.Dispatcher.InvokeShutdown 到目前为止,我有一个附加的行为组合来连接到结束事件中以处理清理和ViewModel上的一个操作,如 vm.OnCloseAction = ()=> view.

我的应用程序使用著名的IDialogService的变体创建了许多子视图。现在,我需要在特定事件或一组事件发生时,以编程方式关闭这些视图

首先,我应该如何最好地揭示观点的封闭方法,记住

  • 必须释放视图的DataContext(ViewModel)并
  • 必须为每个要关闭的视图调用View.Dispatcher.InvokeShutdown
  • 到目前为止,我有一个附加的行为组合来连接到结束事件中以处理清理和ViewModel上的一个操作,如

    vm.OnCloseAction = ()=> view.Close();
    
    处理从ViewModel实际关闭视图的步骤


    不过,我觉得这并不特别优雅。有人有其他想法或替代方法吗?

    一个想法是使用您正在使用的任何消息传递框架(如我使用的MVVM Light中的Messenger),设置一条结束消息(或类似的内容),并在结束消息的“关闭”注册表中设置任何需要执行的操作

    我正在使用EventAggregator做这类事情,但是你会把订阅代码放在哪里呢?我不确定我是否完全理解你的场景,但是订阅代码可以放在任何地方,对吗?如果您有需要清理的视图,请订阅代码隐藏。如果您有需要单独清理的viewmodels,请在那里订阅。eventaggregator使它保持松散耦合,因此在何处使用它并不重要。