2010-09-01 17 views
10

कुछ है कि मुझे MVVM के बारे में भ्रमित करने के लिए जारी है शुरु कर रहा है - अगर मैं अपने वस्तुओं (यह, सबसे आम तरीका होने के लिए कम से कम ज्यादा पढ़ने के बाद और खोज दिखाई देता है) का निर्माण करने के लिए दृश्य-पहले दृष्टिकोण का उपयोग, मैं कैसे मिलता है व्यूमोडेल में प्रासंगिक जानकारी?एक viewmodel

मैं इसी तरह के सवाल करने के लिए कई जवाब देखा है कहते हैं कि "अपने मॉडल सुई डि कंटेनर का उपयोग," लेकिन यह है कि मुझे यहाँ मदद नहीं करता है, तो मैं एक छोटा सा उदाहरण प्रदान करने के लिए जा रहा हूँ।

मान लीजिए कि अपने आवेदन एक PeopleEditor में है। यह लोगों की वस्तुओं को लोड और संपादित करने के लिए बनाया गया है, जो जटिल हैं। जब आप एप्लिकेशन लोड करते हैं, तो आपको एक होम स्क्रीन मिलती है जो लोगों के समूह को स्मृति में लोड करती है - मान लें कि उन सभी को एक संग्रह के माध्यम से सुलभ बनाया गया है जिसे मैं अपने कंटेनर से प्राप्त कर सकता हूं। किसी व्यक्ति पर क्लिक करके, आपको संपादक स्क्रीन पर ले जाया जाता है। संपादक जटिल है, इसलिए यह एक स्क्रीन में लागू एक छोटा मास्टर-विस्तार दृश्य नहीं है।

तो, होम स्क्रीन पर, जब मैं एक व्यक्ति पर क्लिक करें, आवेदन एक नया दृश्य और viewmodel बना सकते हैं और दृश्य दिखाने के लिए की जरूरत है। यदि मैं कंटेनर के माध्यम से पहले व्यूमोडेल बना देता हूं या नहीं, तो मैं इसे उपयुक्त व्यक्ति ऑब्जेक्ट के साथ प्रारंभ कर सकता हूं। यह मेरे लिए बहुत स्वाभाविक प्रतीत होता है, इसलिए मुझे मुश्किल समय लग रहा है कि क्यों पहली बार मुख्य पैटर्न प्रतीत होता है। दृश्य-प्रथम दृष्टिकोण का उपयोग करके मैं इसे कैसे करूँगा? दृश्य व्यूमोडेल बनाएगा, जो लोगों के संग्रह में जा सकता है लेकिन यह नहीं जानता कि कौन सा व्यक्ति इसका संपादन कर रहा है। स्पष्टता के लिए संपादित करें: एकाधिक लोग संपादक एक समय में मौजूद हो सकते हैं, प्रत्येक एक अलग व्यक्ति को संपादित कर सकता है।

प्रिज्म 4.0 अल्फा के MVVM संदर्भ कार्यान्वयन एक "राज्य हैंडलर" है, जो मूल रूप से एक सेवा है कि एप्लिकेशन कंटेनर में एक निर्माता पैरामीटर दुकान का उपयोग करता है का उपयोग करता है। यह राज्य को बचाता है और शोव्यू को कॉल करता है, और व्यूमोडेल जो आखिरकार एक राज्य वस्तु आयात करता है। यह मेरे लिए घबराहट लगता है - ऐसा लगता है कि यह वास्तव में नहीं होने पर यह कमजोर युग्मित होने का नाटक करने की कोशिश कर रहा है। क्या किसी और के पास कोई अन्य मार्गदर्शन है?

+0

तुम क्यों viewmodel पहले दृष्टिकोण का उपयोग करने के लिए जब आप अपने को अपने लिए अधिक प्राकृतिक कहना चाहते है? मार्लन ग्रैच ने कहा कि पहले देखें या व्यूमोडेल व्यक्तिगत वरीयता का विकल्प है (इसके साथ मिश्रण में काम करना आसान है)। मुझे भी ऐसा लगता है और मैं उस दृष्टिकोण का उपयोग करता हूं जो मेरे परिदृश्य के लिए सबसे अच्छा है। इसलिए मैं अपने ऐप्स में दोनों जो मिश्रण करना चाहता हूं उसके आधार पर मिश्रण करता हूं। – blindmeis

+0

दिलचस्प सवाल। मैं हमेशा अपने आप को दृष्टिकोण-प्रथम दृष्टिकोण के बारे में एक ही तरह के प्रश्न पूछता हूं ... व्यूमोडेल-पहले इतना अधिक प्राकृतिक लगता है, इसलिए मैं हमेशा –

+0

@blindmeis का उपयोग करता हूं: प्रतिक्रिया के लिए धन्यवाद। ऐसा नहीं है कि मैं व्यूमोडेल-प्रथम का उपयोग नहीं करना चाहता - असल में, इस प्रकार मेरे ऐप को अभी संरचित किया गया है - यह सिर्फ इतना है कि मैं इस बारे में उत्सुक हूं कि इसे किसी दृश्य में कैसे किया जाएगा। जो मैं अपने आवेदन में हासिल करने की कोशिश कर रहा हूं वह मेरे लिए काफी आम है और दृश्य-मॉडल पहले इतना स्वाभाविक लगता है कि मैं यह नहीं समझ सकता कि "व्यूमोडेल संरचना" या "व्यूमोडेल-फर्स्ट" के लिए और अधिक बेहतर हिट क्यों हैं। – nlawalker

उत्तर

3

nlawalker,

मैं विशेषज्ञ नहीं हूँ, लेकिन मैं क्या व्यू-प्रथम और मॉडल-पहले सीखना है:

  1. देखें-प्रथम: देखें कार्यक्रमों ViewModel, फिर आप दृश्य बनाने के स्वचालित रूप से बनाया ViewModel ।
  2. मॉडल-प्रथम: व्यू मॉडेल प्रोग्राम देखें, आप रूट एप्लिकेशन में ViewModel ऑब्जेक्ट ग्राफ़ बनाते हैं, इसे रूट व्यू डेटा संदर्भ में असाइन करें। तो दृश्य को अपने संबंधित बच्चे को प्रस्तुत करने देता है दृश्य मॉडल पर निर्भर करता है।

कहने के लिए मॉडल-पहले दृष्टिकोण बुरा है लेकिन, क्योंकि viewmodel कोड में बैठता पीछे कर सकते हैं मैं दृश्य-पहले दृष्टिकोण पसंद करते हैं, तो (PasswordBox, DialogConfirmation, ClosingForm जब कुछ प्रक्रिया गैर बाध्यकारी अनुकूल कार्य की आवश्यकता होती है इसका मतलब यह नहीं है आदि), मैं अपने तर्क को पीछे कोड में लिख सकता हूं।

वैसे भी, मैं आमतौर पर मामला आईओसी और घटना एग्रीगेटर के संयोजन का इस्तेमाल किया हल करने के लिए। यहां यह है:

  1. व्यूमोडेल के लिए प्रासंगिक जानकारी के लिए आईओसी कंटेनर में इसके प्रकार की तुलना में इसके उदाहरण की आवश्यकता होती है। तो यह एलीस भी इसके विचार को तैयार नहीं है।
  2. जब नेविगेशन कार्रवाई होती है (लोगों की सूची आइटम पर क्लिक करके) IOC कंटेनर रिज़ॉल्वर के साथ अपना दृश्य हल करें। और निर्दिष्ट पैरामीटर के साथ नेविगेशन बस में एक घटना भेजें। इसके अलावा यह कार्यक्रम लक्ष्य ViewModel द्वारा पकड़ लेगा और कुछ करेगा।

व्यूमोडेल का उदाहरण पंजीकरण करना वास्तव में आवश्यक नहीं है। यह केवल यह सुनिश्चित करने के लिए है कि पिछले व्यूमोडेल द्वारा भेजे गए ईवेंट के दौरान व्यूमोडेल तैयार है।

अद्यतन

लेकिन फिर स्थानीय संदर्भ मैं इसे एक घटना भेजने के लिए एक वैश्विक सुविधा उपयोग करने की आवश्यकता के किसी भी प्रकार से पॉप्युलेट करने के लिए?

आपके मामले में, प्रासंगिक वस्तु स्थानीय नहीं है बल्कि ऑब्जेक्ट आमंत्रण के बीच एक संदेश पारित किया गया है। अपने मॉडल-पहले दृष्टिकोण में जाहिर है आप करते हैं:

//selectedPeople is contextual object 
myPeopleDetailVM.LoadData(selectedPeople) 

यह बहुत ज्यादा एक ही है जब आप selectedPeople घटना बस के तर्क को पारित करेंगे।

आप प्रदर्शन पर विचार, की तुलना में आप इस मामले रणनीति रूटिंग में WPF Routed Event System के साथ तुलना कर सकते हैं इवेंट बस से अधिक जटिल है और मुझे लगता है कि आप काफी आश्वस्त का उपयोग कर यदि WPF से आप घटना एग्रीगेटर के साथ करना चाहिए घटना कराई।

एकमात्र समस्या जो मैं देखता हूं कि यदि आप अंतर्निहित फ्रेमवर्क इवेंट एग्रीगेटर (प्रिज्म, एमवीएमएमएलआईटी) का उपयोग करते हैं, तो आपका व्यूमोडेल इवेंट बस के साथ प्रदूषित हो जाता है, अगर आप इसके बारे में शिकायत करते हैं तो मैं आपके साथ सहमत हूं।

आशा है कि मदद करें।

+0

प्रतिक्रिया के लिए धन्यवाद। यह मेरे मन में काफी सुंदर है, लेकिन यह मेरे लिए इतना अजीब लगता है - आईओसी का उपयोग अपने व्यूमोडेल को बनाने के लिए करें, ठीक है, लेकिन फिर किसी भी स्थानीय संदर्भ के साथ इसे पॉप्युलेट करने के लिए मुझे इसे एक वैश्विक सुविधा का उपयोग करने की आवश्यकता है घटना? यह सिर्फ मेरे लिए अजीब लगता है। – nlawalker

+0

मैंने अपना जवाब अपडेट कर लिया है। – ktutnik

0

यदि आप प्रिज्म का उपयोग कर रहे हैं, तो आप इसकी नेविगेशन सुविधा का उपयोग करके आसानी से और अच्छी तरह से इस समस्या को हल कर सकते हैं। IRegionManager.Request का उपयोग करें मुख्य दृश्य से नेविगेट करने के लिए लक्षित दृश्य की उरी का निर्माण करके संपादन दृश्य में नेविगेट करने के लिए संबंधित व्यक्ति की पहचान के लिए क्वेरी स्ट्रिंग पैरा शामिल करें। आप उस आईडी को लक्ष्य दृश्य मॉडल के OnNavigatedTo() विधि कार्यान्वयन (INavigationAware सदस्य) में निकालें। दृश्य मॉडल को इस इंटरफ़ेस को कार्यान्वित करना चाहिए)।

आप इसे "व्यू-स्विथिंग नेविगेशन" नमूना ऐप में कार्रवाई में देख सकते हैं जिसे प्रिज्म डाउनलोड के साथ भेज दिया गया है। इसके क्विकस्टार्ट फ़ोल्डर के तहत।

ही नमूना अनुप्रयोग (जो आउटलुक नकल), इस निम्नलिखित कोड इनबॉक्स से किसी विशेष ईमेल खोलने के लिए emailview को InboxView से नेविगेट करने के लिए प्रयोग किया जाता है से:

var builder = new StringBuilder(); 
builder.Append(EmailViewKey); 
var query = new UriQuery(); 
query.Add(EmailIdKey, document.Id.ToString("N")); 
builder.Append(query); 
this.regionManager.RequestNavigate(RegionNames.MainContentRegion, new Uri(builder.ToString(), UriKind.Relative)); 

और emailview का दृष्टिकोण मॉडल EmailViewModel में ईमेल खोले जाने के लिए इस तरह नेविगेशन संदर्भ से निकाला जाता है:

void INavigationAware.OnNavigatedTo(NavigationContext navigationContext) 
    { 
     // todo: 15 - Orient to the right context 
     // 
     // When this view model is navigated to, it gathers the 
     // requested EmailId from the navigation context's parameters. 
     // 
     // It also captures the navigation Journal so it 
     // can offer a 'go back' command. 
     var emailId = GetRequestedEmailId(navigationContext); 
     if (emailId.HasValue) 
     { 
      this.Email = this.emailService.GetEmailDocument(emailId.Value); 
     } 

     this.navigationJournal = navigationContext.NavigationService.Journal; 
    } 

private Guid? GetRequestedEmailId(NavigationContext navigationContext) 
    { 
     var email = navigationContext.Parameters[EmailIdKey]; 
     Guid emailId; 
     if (email != null && Guid.TryParse(email, out emailId)) 
     { 
      return emailId; 
     } 

     return null; 
    } 
संबंधित मुद्दे