2011-08-08 14 views
11

मैं कैसे सुनिश्चित कर सकता हूं कि दृश्य मॉडल ठीक से निपटान किए गए हैं यदि वे अप्रबंधित संसाधनों का संदर्भ देते हैं या ईवेंट हैंडलर हैं जैसे प्रेषक टाइमर पर समाप्त होकर। पहले मामले में, फाइनलर एक विकल्प है, हालांकि आदर्श नहीं है, लेकिन बाद में, इसे कभी नहीं कहा जाएगा। जब हम दृश्य मॉडल से जुड़े दृश्य को नहीं देखते हैं तो हम कैसे बता सकते हैं।डब्ल्यूपीएफ में डिस्पोजेबल व्यू मॉडल का उपयोग कैसे करें?

+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(); 
         }; 
        } 
    } 
    
संबंधित मुद्दे