Wpf 当父窗口关闭时,如何处理动态加载的usercontrols/viewmodels

Wpf 当父窗口关闭时,如何处理动态加载的usercontrols/viewmodels,wpf,window,dispose,Wpf,Window,Dispose,我们有一个启动子窗口的主窗口。该子窗口动态加载自定义用户控件。在这些usercontrols的构造函数中,我传递了一个主对象,该主对象从这个主对象生成一个特定于usercontrol的viewmodel,并将其指定为datacontext 所有这些都很有效。然而,我jst发现,当我关闭子窗口时,至少我的一些自定义用户控件仍然处于活动状态。我应该如何清理控件/视图模型?在主窗口关闭之前,似乎不会调用任何内容。没有析构函数,没有Dispatcher.ShutdowStart,没有dispose可用,

我们有一个启动子窗口的主窗口。该子窗口动态加载自定义用户控件。在这些usercontrols的构造函数中,我传递了一个主对象,该主对象从这个主对象生成一个特定于usercontrol的viewmodel,并将其指定为datacontext

所有这些都很有效。然而,我jst发现,当我关闭子窗口时,至少我的一些自定义用户控件仍然处于活动状态。我应该如何清理控件/视图模型?在主窗口关闭之前,似乎不会调用任何内容。没有析构函数,没有Dispatcher.ShutdowStart,没有dispose可用,没有关闭事件,我找不到任何东西


有人知道在窗口关闭后应该做些什么来正确清理吗?

我认为您需要准确地思考创建视图和视图模型的责任,以及确定某个对象是否可以关闭的责任,等等

无论是什么东西创造了某种东西来摧毁它,这通常是个好主意。因此,如果您的子窗口正在创建自定义用户控件,它可能应该负责删除它们。但是,我相信如果您的对象都没有引用(或强事件订阅),那么它最终应该被垃圾收集。您可以实现一个终结器/析构函数,并将Debug.String输出到输出窗口,以查看何时可能最终发生这种情况。一个好的内存分析器也是一个好主意。但是,您也可能需要更精确的控制来告知ViewModel何时关闭

很难说在你的场景中应该发生什么,因为这实际上取决于你的具体设置。让我向您描述我在应用程序中的一个场景。我有几个视图显示在选项卡页面中。选项卡页面有一个关闭选项卡的X按钮,“我的视图”包含一个托管的Windows窗体控件,需要调用.Dispose()来清理资源,还需要通知它何时取消订阅“文件”菜单系统中的复合命令。所以,一开始,我有一个问题。。。当选项卡页面删除视图时,我的ViewModel如何取消订阅命令?WPF控件中包含的视图如何知道它何时被删除?这是我想到的

  • 选项卡页面本身不应该告诉我的程序视图是否可以关闭
  • 我需要能够在程序逻辑的情况下取消关闭事件(文件已保存?是/否/取消)
  • 我需要能够检测它何时关闭,这样我就可以在那个确切的时刻清理/取消注册
  • 我的解决方案是在我的viewmodel中实现一个名为IRemovable的接口,该接口公开了一个Removable boolean和一个Remove()方法,该方法返回一个boolean(已删除或未删除)。我的选项卡控件仅在Removable为true时显示X按钮,如果tab控件的关闭触发IRemovable ViewModel的Remove(),如果返回false,则在ViewModel的Remove返回false时将event args Canceled属性设置为true

    因此,删除视图模型可能会提示用户进行确认、从命令中注销等。视图可以处理关闭的事件并调用任何Windows窗体组件上的Dispose等(当然,我必须检查我的view.DataContext是否可移动)


    无论如何,我知道这不是一个确切的答案,但希望它能帮助您想出一些解决您自己问题的想法

    我相信您需要准确思考创建视图和视图模型的原因,以及确定某个对象是否可以关闭的原因,等等

    无论是什么东西创造了某种东西来摧毁它,这通常是个好主意。因此,如果您的子窗口正在创建自定义用户控件,它可能应该负责删除它们。但是,我相信如果您的对象都没有引用(或强事件订阅),那么它最终应该被垃圾收集。您可以实现一个终结器/析构函数,并将Debug.String输出到输出窗口,以查看何时可能最终发生这种情况。一个好的内存分析器也是一个好主意。但是,您也可能需要更精确的控制来告知ViewModel何时关闭

    很难说在你的场景中应该发生什么,因为这实际上取决于你的具体设置。让我向您描述我在应用程序中的一个场景。我有几个视图显示在选项卡页面中。选项卡页面有一个关闭选项卡的X按钮,“我的视图”包含一个托管的Windows窗体控件,需要调用.Dispose()来清理资源,还需要通知它何时取消订阅“文件”菜单系统中的复合命令。所以,一开始,我有一个问题。。。当选项卡页面删除视图时,我的ViewModel如何取消订阅命令?WPF控件中包含的视图如何知道它何时被删除?这是我想到的

  • 选项卡页面本身不应该告诉我的程序视图是否可以关闭
  • 我需要能够在程序逻辑的情况下取消关闭事件(文件已保存?是/否/取消)
  • 我需要能够检测它何时关闭,这样我就可以在那个确切的时刻清理/取消注册
  • 我的解决方案是在我的viewmodel中实现一个名为IRemovable的接口,该接口公开了一个Removable boolean和一个Remove()方法,该方法返回一个boolean(已删除或未删除)。我的选项卡控件仅在Removable为true时显示X按钮,如果tab控件的关闭触发IRemovable ViewModel的Remove(),如果返回false,则在ViewModel的Remove返回false时将event args Canceled属性设置为true

    因此,删除视图模型可能会提示用户