How to use disposable view models in WPF?

那年仲夏 提交于 2019-12-03 17:50:32

问题


How do I ensure view models are properly disposed of if they reference unmanaged resources or have event handlers such as handling elapsed on a dispatcher timer. In the first case, a finaliser is an option, although not ideal, but in the latter, it will never be called. How can we tell when there is no longer a view attached to the view model.


回答1:


I accomplished this by doing the following:

  1. Removing the StartupUri property from App.xaml.
  2. Defining my App class as follows:

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



回答2:


One possible, although not perfect solution:

Implement IDisposable on the View Model, then use this extension method in the constructor of the view.

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


来源:https://stackoverflow.com/questions/6983801/how-to-use-disposable-view-models-in-wpf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!