2012-10-29 74 views
0

我们有一个启动子窗口的主窗口。该子窗口动态加载自定义的用户控件。在这些用户控件的构造器中,我传递了一个主对象,该对象从此主对象中生成一个用户控件特定的视图模型并将其指定为其数据上下文。如何在父窗口关闭时处理动态加载的usercontrols/viewmodels

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

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

+0

你怎么知道你的控件仍然活跃的一些想法? –

回答

0

我相信你需要考虑精确什么是负责创建你的意见和你的ViewModels,什么是负责确定是否不是可以关闭与否等

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

很难确切地说出您的情况会发生什么,因为它确实取决于您的确切和特定的设置。让我向你描述一下我的应用程序中的场景。我有几个视图显示在标签页中。标签页有一个X按钮来关闭标签,我的视图包含一个托管的Windows窗体控件,它需要调用.Dispose()来清理资源,并且需要知道何时取消订阅复合命令文件菜单系统。所以,最初,我有一个问题...当标签页删除视图时,我的ViewModel如何取消订阅命令? WPF控件中包含的视图如何知道它何时被删除?这里就是我想出了

  1. 标签页本身不应该告诉我的程序,如果一个视图可以或不能
  2. 我需要取消closing事件在程序逻辑的情况下,才能关闭(文件得救了吗?是/否/取消),当它被关闭,以便
  3. 我需要检测的能力,我可以就在那个时候清理/注销

我的解决办法,以实现我的视图模型称为IRemovable的接口,公开了一个可移动布尔值和一个返回boolea的Remove()方法n(被删除或没有)。如果Removable为true,我的选项卡控件只显示X按钮,Tab Control的Closing激发了IRemovable ViewModel的Remove(),如果它返回false,则将ViewModel的Remove返回false的事件参数Canceled属性设置为true。

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

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

相关问题