2011-08-08 21 views
11

如何確保視圖模型在引用非託管資源或事件處理程序(如處理已調用調度程序計時器)時正確處置。在第一種情況下,終結者是一種選擇,雖然不理想,但在後者中,它將永遠不會被調用。我們如何判斷何時不再有視圖模型的視圖。如何在WPF中使用一次性視圖模型?

+0

我已經回答了我的問題,因爲我有一個解決方案,我認爲作品,但我希望有人能給我一個更好的解決方案,我可以標記爲接受的答案。 – ForbesLindesay

回答

5

一種可能,雖然不是完美的解決方案:

在視圖模型實現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(); 
    } 
7

我做到了這一點通過以下操作:

  1. 去除App.xaml中的StartupUri屬性。
  2. 定義我的應用程序類,如下所示:

    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(); 
         }; 
        } 
    } 
    
相關問題