2009-03-13 13 views
5

एमवीवीएम पर बहुत सारे शानदार उदाहरण हैं लेकिन मैं अभी भी उलझन में हूं।सिल्वरलाइट एमवीवीएम लिंकिंग मॉडल और मॉडल

मान लें कि आपके पास ग्राहक मॉडल और ग्राहक दृश्य मॉडल है। ऐसा लगता है कि ग्राहक मॉडल पर एक नाम संपत्ति होगी और एक ग्राहक ViewModel पर होगा। CustomerViewModel पर सेटटर ग्राहक मॉडल नाम संपत्ति सेट करेगा और फिर OnPropertyChanged (PropName) को कॉल करेगा ताकि यूआई अपडेट हो सके। क्या यह वास्तव में सही है? ऐसा लगता है कि गेटर/सेटर्स को दो बार परिभाषित किया जाएगा। यदि आपके पास 50 गुणों वाला मॉडल है तो वह असली थकाऊ हो जाएगा।

इसके अलावा, मान लें कि मैंने एक मात्रा संपत्ति निर्धारित की है। ViewModel मॉडल अद्यतन करता है। मॉडल नई मात्रा के आधार पर इसकी वैल्यू प्रॉपर्टी अपडेट करता है। व्यूमोडेल को कैसे सूचित किया जाता है कि मॉडल संपत्ति बदल गई है?

उत्तर

2

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

उदा। दृश्यता झंडे, वर्तमान टैब सूचकांक, कई क्षेत्रों में डेटा से बाहर बनाया पाठ के और अधिक जटिल बिट्स, ObservableCollection बच्चे मदों की < >, आदि सभी वहाँ के लिए कर रहे हैं -

public int Name 
{ 
    get 
    { 
     return this.name; 
    } 

    set 
    { 
     if (this.name!= value) 
     { 
      this.name= value; 
      this.OnPropertyChanged("Name"); 
     } 
    } 
} 

ViewModel भी यूआई राज्य के अन्य बिट्स शामिल एक्सएएमएल से बंधे रहें।

मैंने मॉडल से बनाई गई व्यूमोडेल को एक बार, एक तरफा प्रक्रिया, उदाहरण के रूप में देखा है। एक निर्माता के साथ:

CustomerViewModel viewModel = new CustomerViewModel(customer); 

या एक विस्तार विधि

CustomerViewModel viewModel = customer.ToViewModel(); 

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

आप मॉडल के साथ व्यूमोडेल को अद्यतित रखने के लिए बहुत मेहनत कर रहे हैं - अधिकांश मामलों जैसे सहेजने या लोड करने के लिए आप वर्तमान व्यू मॉडेल को फेंक सकते हैं और मॉडल की वर्तमान स्थिति से नया बना सकते हैं। क्या आपको ViewModel के UI स्थिति को रखने और उसमें डेटा बदलने की आवश्यकता है? यह एक आम आवश्यकता नहीं है लेकिन इसे सहेजने या लोड होने पर एक विधि या दो के साथ किया जा सकता है।

तो यह भी माना जाता है कि यह वायर-अप तर्क कहीं होता है। यही कारण है कि अधिकांश पैटर्न जिनमें विचार शामिल हैं नियंत्रक जो आदेशों पर कार्य करने के लिए ज़िम्मेदार हैं (उदा। ग्राहक दिखाएं, ग्राहक को बचाएं) और बाद में नया यूआई राज्य स्थापित करें।

+0

यदि आप मॉडल से अलग व्यूमोडेल रखते हैं तो मॉडल में कोई नियम कैसे लागू होते हैं? मान लें कि मेरे पास मात्रा और मूल्य वाला मॉडल है। यदि मैं व्यूमोडेल पर मात्रा बदलता हूं जो मॉडल के माध्यम से बहती है जो नई मात्रा के आधार पर मान अपडेट करती है। अब ViewModel को नया मान दिखाना चाहिए। –

+0

"अगर मैं व्यूमोडेल पर मात्रा बदलता हूं जो मॉडल के माध्यम से बहती है" नहीं, जब तक कि आप एक सेव बटन दबाएं या नहीं। जब आप करते हैं, उसके लिए हैंडलर मॉडल को अद्यतन करना चाहिए, इसे जारी रखें और नए मॉडल स्थिति से नया व्यूमोडेल बनाएं। – Anthony

+0

तो यदि यह मॉडल के माध्यम से बहता नहीं है, तो ViewModel को कभी भी एक अद्यतन मान फ़ील्ड कैसे मिलता है? यदि मैं मात्रा बदलता हूं, तो उपयोगकर्ता के रूप में मैं नया मान देखने की उम्मीद करता हूं। एमवी में कैल्क वैल्यू के लिए व्यवसाय तर्क नहीं है, केवल मॉडल करता है। –

5

आपका व्यू मॉडल मॉडल को सख्ती से मॉडल को समाहित करने की आवश्यकता नहीं है। आपके परिदृश्य में, ग्राहकव्यूमोडेल में ग्राहक प्रॉपर्टी हो सकती है, जिसका अंत में आपका दृश्य मॉडल गुणों से जुड़ा हुआ है ... यह व्यूमोडेल के माध्यम से ऐसा करता है। यह पूरी तरह से वैध है। उस ने कहा, हालांकि, इसे encapsulating करने के लिए अक्सर एक लाभ होता है। आपके व्यावसायिक मॉडल में परिवर्तन अधिसूचना शामिल नहीं हो सकती है। हो सकता है कि उपयोगकर्ता तब तक व्यावसायिक मॉडल को संशोधित न करें जब तक उपयोगकर्ता ठीक बटन पर क्लिक न करे।आपका व्यवसाय मॉडल खराब इनपुट के अपवादों के माध्यम से हो सकता है, जबकि आप सत्यापन के किसी अन्य रूप का उपयोग करना चाहते हैं। मुझे यकीन है कि आप अन्य चीजों के बारे में सोच सकते हैं। असल में, मुझे लगता है कि ज्यादातर समय आप encapsulation चाहते हैं, तो यह वास्तव में बहुत सारे व्यर्थ रिले विधियों को लिखने के अर्थ में "थकाऊ" नहीं है।

0

बिल्कुल यह कैसे किया जाता है, यह आपके व्यापार मॉडल पर निर्भर करेगा क्योंकि wekempf पहले ही बता चुका है।

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

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