2009-09-01 15 views
9

मैं MSDN की तरह विभिन्न स्रोतों से MVVM पैटर्न के बारे में पढ़ रहा:कौन सिल्वरलाइट MVVM में DataContext सेट है

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

उस लेख में यह कहते हैं: एमवीपी में प्रस्तुतकर्ता के विपरीत, एक ViewModel एक की जरूरत नहीं है एक दृश्य के संदर्भ में।

देखें (XAML) मान लिया गया यह DataContext तो ViewModel वह जगह है जहाँ कोड में निम्न पंक्ति है बताया गया है:

view.DataContext = viewModel; 

ViewModel दृश्य के बारे में कुछ भी पता नहीं है तो यह DataContext निर्धारित नहीं कर सकते। यदि मैं व्यूमोडेल को संदर्भ देता हूं तो क्या मैं एमवीवीएम पैटर्न तोड़ता हूं? मेरी दूसरी पसंद किसी प्रकार का बिल्डर या अतिरिक्त प्रेजेंटर होना है जिसका एकमात्र काम पूरी चीज को तार करना है (दृश्य की लोड की गई घटना के लिए प्रतीक्षा करें, डेटाकेंटेक्स्ट सेट करें)।

मुझे पता है कि अलग-अलग दृश्य एक ही डेटाकॉन्टेक्स्ट साझा कर सकते हैं (उदा। केवल मेनविंडो के लिए डेटा कॉन्टेक्स्ट सेट करें और अन्य इसे देखेंगे) लेकिन कई मामलों में यह संभव नहीं है और यहां तक ​​कि व्यवहार्य भी नहीं है।

उत्तर

3

शॉन Wildermuth कि क्या दृश्य के बारे में एक महान पोस्ट है या ViewModel पहले आता है: जहां एक 3 पार्टी वर्ग दोनों को देखने और viewmodel बनाता है, और फिर एकत्रित करती है उसकी शादी अवधारणा http://wildermuth.com/2009/05/22/Which_came_first_the_View_or_the_Model

मुझे पसंद है, और उपयोग करते हैं, दो। यह मेरे लिए अच्छा काम किया है।

6

यह एक अच्छा सवाल है जिसमें कई जवाब हैं। यह सब इस बात पर निर्भर करता है कि आप अपने आवेदन को कैसे आर्किटेक्ट करना चाहते हैं। उदाहरण के लिए, मैं अपने IViewModel को बनाने के लिए निर्भरता इंजेक्शन का उपयोग करता हूं, जो बदले में मेरा IView बनाता है और मेरा IViewModel एक IView.SetViewModel (यह) को कन्स्ट्रक्टर पर चलाता है। एक DataTemplate के उदाहरण में

<UserControl.DataContext> 
    <ns:CrazyViewModel /> 
</UserControl.DataContext> 

कभी कभी DataContext गर्भित किया जा सकता है तो यह ढांचा द्वारा निर्धारित है, जैसे:

अन्य लोगों को Xaml में DataContext स्थापना करके एक अधिक blendable विधि का उपयोग करना चाह सकते हैं एक आइटम नियंत्रण द्वारा प्रयोग किया जाता है। यह डेस्कटॉप WPF में भी बहुत आम है क्योंकि यह टाइप किए गए डेटा टेम्पलेट का समर्थन करता है।

तो डेटा कॉन्टेक्स्ट को सेट करने का कोई गलत तरीका नहीं है, बस जब तक आप चिंताओं को अलग करते हैं, तब तक बनाए रखने योग्य और आसानी से परीक्षण योग्य भी होता है।

0

मैं प्रिज्म के साथ एमवीवीएम का बहुत उपयोग करता हूं। प्रिज्म में मैं निर्भरता इंजेक्शन के लिए एकता का उपयोग करता हूं। इसलिए मेरे पास दृश्य सहित यूनिटी के साथ पंजीकृत प्रत्येक वर्ग के लिए एक इंटरफ़ेस है।

void SetViewModel(object viewModel); 

ViewModel अपने निर्माता के अंत में इस प्रणाली को बुलाती है, एक पैरामीटर के रूप में ही गुजर: IVIEW इंटरफ़ेस इस तरह की एक विधि है

public ViewModel(IView view, ...) 
{ 
    ... 
    this._view=view; 
    this._view.SetViewModel(this); 
} 

View.xaml.cs में IView इंटरफ़ेस लागू किया गया है।

public partial class View:UserControl, IView 
{ 
    public View() 
    { 
    ... 
    } 

    public SetViewModel(object viewModel) 
    { 
    this.DataContext = viewModel; 
    } 

} 
0

मेरे अपने उपयोग के लिए के रूप में, ViewModel देखें पता नहीं है, या दृश्य पर कोई इंटरफ़ेस: यह केवल कोड मैं देखने के codebehind में जोड़ने के लिए किया जाएगा। और अधिकांश समय, व्यू इसके व्यू मॉडेल को नहीं जानता है, भले ही यह कम महत्वपूर्ण हो। वीएम सिर्फ डेटाकॉन्टेक्स्ट द्वारा ट्रांसप्रेट किया गया है।

यह सुनिश्चित करता है कि वीएम और वी अत्यधिक स्वतंत्र रहेगा। लिंक बाध्यकारी, कमांडिंग, व्यवहार, ट्रिगर्स & पर स्थापित किए गए हैं। यहां तक ​​कि यदि वीएम अक्सर किसी दिए गए दृश्य से अत्यधिक संबंधित होता है, तो भी मैं इसे जितना संभव हो उतना सामान्य बनाने की कोशिश करता हूं, ताकि मैं संबंधित दृश्य को स्विच कर सकूं, और/या वीएम को अपडेट करने की आवश्यकता के बिना व्यू व्यवहार को अनुकूलित कर सकूं, सिवाय इसके कि आर्किटेक्चरल लिंक वी और एम के बीच प्रभावित है!

संबंधित मुद्दे