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

时间:2012-10-29 20:06:29

标签: wpf window dispose

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

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

任何人都知道在窗户关闭后应该做些什么来正确清理?

1 个答案:

答案 0 :(得分:1)

我认为你需要准确地思考什么是负责创建你的观点和你的观点模型,以及负责确定某些东西是否可以关闭等等。

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

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

  1. 如果视图可以关闭或不能关闭,标签页本身不应该告诉我的程序
  2. 我需要能够在程序逻辑的情况下取消关闭事件(文件保存?是/否/取消)
  3. 我需要能够检测它何时关闭,以便我可以在那个确切的时刻进行清理/取消注册
  4. 我的解决方案是在我的viewmodel中实现一个名为IRemovable的接口,该接口公开了一个可移动的布尔值和一个返回布尔值的Remove()方法(已删除或未删除)。如果Removable为true,我的选项卡控件只显示X按钮,Tab Control的Closing触发了IRemovable ViewModel的Remove(),如果返回false,则如果ViewModel的Remove返回false,则将事件args Canceled属性设置为true。

    因此,删除视图模型可能会提示用户进行确认,从命令中取消注册等。视图可以处理Closed事件并在任何Windows窗体组件上调用Dispose等。(当然我必须检查我的视图.DataContext是IRemovable)。

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