2011-03-30 17 views
6

एमवीवीएम पैटर्न के बाद मैं व्यू मॉडल से अनुरोध के जवाब में दृश्य द्वारा एक बच्चे विंडो के प्रदर्शन को तार करने की कोशिश कर रहा हूं।क्या यह कोडिंग शैली परिणामस्वरूप स्मृति रिसाव

MVVM लाइट मैसेंजर दृश्य का उपयोग करके अनुरोध देखें की निर्माता के रूप में तो में चाइल्ड विंडो प्रदर्शित करने के लिए के लिए रजिस्टर होगा:

InitializeComponent(); 
Messenger.Default.Register<EditorInfo>(this, (editorData) => 
{ 
    ChildWindow editWindow = new EditWindow(); 
    editWindow.Closed += (s, args) => 
    { 
     if (editWindow.DialogResult == true) 
      // Send data back to VM 
     else 
      // Send 'Cancel' back to VM 
    }; 

    editWindow.Show(); 
}); 

एक लैम्ब्डा कारण समस्याओं का उपयोग कर ChildWindow बंद घटना की सदस्यता है कचरा संग्रह के लिए। या इसे एक और तरीका दें, जब (अगर कभी) संपादन विन्डो अव्यवस्थित हो जाएगा और इसलिए कचरा संग्रह के लिए एक उम्मीदवार बन जाएगा।

उत्तर

4

editWindowthis के लिए एक संदर्भ रखना होगा, लेकिन कुछ भी editWindow के लिए एक संदर्भ है, तो यह अंत में कचरा एकत्र किया जाएगा, और this के संदर्भ में छोड़ दिया जाएगा। तो यह किसी भी स्मृति रिसाव का कारण नहीं करना चाहिए ...

क्या आप वाकई होना चाहते हैं वहाँ कोई समस्या नहीं हो जाएगा, आप घटना की सदस्यता छोड़ें:

InitializeComponent(); 
Messenger.Default.Register<EditorInfo>(this, (editorData) => 
{ 
    ChildWindow editWindow = new EditWindow(); 
    EventHandler handler = (s, args) => 
    { 
     editWindow.Closed -= handler; 
     if (editWindow.DialogResult == true) 
      // Send data back to VM 
     else 
      // Send 'Cancel' back to VM 
    }; 

    editWindow.Closed += handler; 

    editWindow.Show(); 
}); 
संबंधित मुद्दे