如何在WPF中使用一次性视图模型?

如果视图模型引用非托管资源或者在调度程序计时器上有事件处理程序(如处理已经过时),我该如何确保它们得到妥善处理。 在第一种情况下,终结者是一种选择,虽然不是理想的,但在后者中,它永远不会被称为。 如何在视图模型中不再附加视图时如何判断。

我通过执行以下操作完成了此操作:

  1. 从App.xaml中删除StartupUri属性。
  2. 定义我的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(); }