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

For*_*say 12 c# wpf idisposable mvvm

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

Jas*_*ere 8

我通过以下方式完成了这项工作:

  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(); 
            };
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


For*_*say 7

一种可能,但不是完美的解决方案:

在视图模型上实现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();
    }
Run Code Online (Sandbox Code Playgroud)