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


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


8635
2017-08-08 14:40


起源

我已经回答了我自己的问题,因为我有一个我觉得有效的解决方案,但我希望有人会给我一个更好的解决方案,我可以将其标记为已接受的答案。 - ForbesLindesay


答案:


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

  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(); 
            };
        }
    }
    

7
2017-11-14 20:10





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

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

6
2017-08-08 14:41