2012-11-06 8 views
5

एमवीवीएम पैटर्न पर सवाल जहां मुझे लगता है कि मेरे पास यह गलत है।देखने के लिए ऑब्जेक्ट पास करना

एक टचडाउन घटना एक दृश्य मैं एक संदेश यानी .:

private void marker_TouchDown(MessageObject msgData) 
{ 
    CustomMessageControl message = new CustomMessageControl() {Width = 610, Height = 332}; 
    CustomMessageViewModel messageVM = new CustomMessageViewModel(msgData); 
    message.DataContext = messageVM; 
    //Add to canvas 
} 

मेरे viewmodel पॉपअप करना चाहते हैं में होता है जब:

public class CustomMessageViewModel 
{ 
    public MessageObject message { get; set; } 

    public CustomMessageViewModel(MessageObject message) 
    { 
     this.MessageObject = message; 
    } 
} 

यह काम करता है लेकिन सही महसूस नहीं करता है। क्या यह दृश्य मॉडल को पॉप्युलेट करने का एक स्वीकार्य तरीका है?

+0

आम तौर पर व्यूमोडल्स आईएनपीसी इंटरफ़ेस (http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx) का उपयोग करेगा ताकि उपभोक्ता को अद्यतन/उपभोक्ता को सूचित किया जा सके। इस परिदृश्य में संलग्न होने पर मैं कोड में डेटाकॉन्टेक्स्ट को एक नए व्यूमोडेल में फिर से परिभाषित करने की सलाह दूंगा। –

+0

धन्यवाद क्विनटन, मैं आईएनपीसी के उपयोग को समझता हूं। मैं शायद यह भी सचमुच देख रहा हूं लेकिन यहां कोई व्यक्ति एक दृश्य पर क्लिक कर रहा है और मैं उस बिंदु से संबंधित कुछ डेटा को पारित करने के लिए एक नया दृश्य लॉन्च करना चाहता हूं। –

+1

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

उत्तर

2

मुझे विश्वास है कि आप दृश्य मॉडल में नियंत्रण बनाने में एमवीवीएम का उल्लंघन कर रहे हैं। यह टेस्टेबल नहीं है, अब आपके नियंत्रण मॉडल में नियंत्रण बनाने के लिए है और यह परीक्षण के लिए आवश्यकता नहीं होनी चाहिए (यह यूआई और दृश्य मॉडल के बीच चिंताओं को अलग करने की कमी पर जोर देती है)।

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

public class CustomMessageControlEventArgs : EventArgs 
{ 
    public CustomMessageViewModel CustomMessageViewModel { get; set; } 
} 

public event EventHandler<CustomMessageControlEventArgs> 
    ShowCustomMessageControl; 

private void marker_TouchDown(MessageObject msgData) 
{ 
    // Create the view model. 
    var message = ...; 

    // Get the events. 
    var events = ShowCustomMessageControl; 

    // Fire. 
    if (events != null) events(this, 
     new CustomMessageControlEventArgs { 
      MessageObject = new CustomMessageViewModel(msgData) 
     }); 
} 

फिर, अपने यूआई कोड में, आप घटना के लिए बाध्य है और फिर होगा: इस घटना में, आप दृश्य मॉडल है कि आप संवाद/ओवरले/नियंत्रण करने के लिए बाध्य करना चाहते हैं, कुछ इस तरह दे देते हैं उस घटना के लिए उपयुक्त यूजर इंटरफेस दिखाएं।

याद रखें, एमवीवीएम XAML में सब कुछ घोषित करने या के माध्यम से UI को बाध्यकारी डेटा के बारे में सख्ती से नहीं है, बस डेटा बाइंडिंग, यह कोड के उचित पृथक्करण के बारे में है।

आप अलग करना चाहते हैं क्या क्या प्रदर्शित किया जाता है (देखें मॉडल) से की कैसे क्या प्रदर्शित किया जाता है (यूआई) के; एक घटना को फायर करने में, आप चिंताओं को अलग कर रहे हैं।

हां, आपको कुछ कोड लिखना होगा (या आप इसे संपत्ति अधिसूचना परिवर्तनों के माध्यम से कर सकते हैं, लेकिन यह उलझन में है), लेकिन यह अलगाव बनाए रखता है और बिना किसी उपयोगकर्ता को लाने के आसान परीक्षण की अनुमति देता है इंटरफ़ेस तत्व।