如果视图模型引用非托管资源或者在调度程序计时器上有事件处理程序(如处理已经过时),我该如何确保它们得到妥善处理。在第一种情况下,终结者是一种选择,虽然不是理想的,但在后者中,它永远不会被称为。如何在视图模型中不再附加视图时如何判断。
如果视图模型引用非托管资源或者在调度程序计时器上有事件处理程序(如处理已经过时),我该如何确保它们得到妥善处理。在第一种情况下,终结者是一种选择,虽然不是理想的,但在后者中,它永远不会被称为。如何在视图模型中不再附加视图时如何判断。
我通过执行以下操作完成了此操作:
定义我的App类如下:
public partial class App : Application
{
public App()
{
IDisposable disposableViewModel = null;
//Create and show window while storing datacontext
this.Startup += (sender, args) =>
{
MainWindow = new MainWindow();
disposableViewModel = MainWindow.DataContext as IDisposable;
MainWindow.Show();
};
//Dispose on unhandled exception
this.DispatcherUnhandledException += (sender, args) =>
{
if (disposableViewModel != null) disposableViewModel.Dispose();
};
//Dispose on exit
this.Exit += (sender, args) =>
{
if (disposableViewModel != null) disposableViewModel.Dispose();
};
}
}
一种可能,但不是完美的解决方案:
在视图模型上实现IDisposable,然后在视图的构造函数中使用此扩展方法。
public static void HandleDisposableViewModel(this FrameworkElement Element)
{
Action Dispose = () =>
{
var DataContext = Element.DataContext as IDisposable;
if (DataContext != null)
{
DataContext.Dispose();
}
};
Element.Unloaded += (s, ea) => Dispose();
Element.Dispatcher.ShutdownStarted += (s, ea) => Dispose();
}