2010-09-29 13 views
8

के बीच अंतर मैंने पहले कभी भी एमवीवीएम का उपयोग नहीं किया है, इसलिए शायद मुझे कुछ स्पष्ट याद आ रही है। जब मैं एक नया पैनोरमा एप्लिकेशन बनाता हूं, तो पहले से ही व्यूमोडेल फ़ोल्डर होता है जिसमें ItemViewModel और MainViewModel होता है।एमवीवीएम - मॉडल और व्यूमोडेल

मैंने सोचा कि "MainViewModel.cs" वह फ़ाइल है जो पैनोरामा का आयोजन करती है।

public MainViewModel() 
    { 
     this.Items = new ObservableCollection<ItemViewModel>(); 
    } 

ItemViewModel चित्रमाला के साथ कोई बातचीत है: हालांकि, MainViewModel भीतर, यह इस लाइन है। ये तब तत्काल तत्काल हैं:

this.Items.Add(new ItemViewModel() 
    { LineOne = "first line", LineTwo = "second line", LineThree = "third line" }); 

आइटमव्यूमोडेल सिर्फ 'मॉडल' क्यों नहीं है? यह INotifyProperty लागू करता है, लेकिन किस उद्देश्य के लिए? मैं, सोचा है होता है कि MainViewModel में ObservableCollection किसी भी बदलाव के बारे में सूचित करने के लिए पर्याप्त होगा के रूप में demonstrated here

धन्यवाद

उत्तर

5

ObservableCollection जब आइटम जोड़ा या सूची से हटा दिए जाते हैं सूचित करेंगे, लेकिन INotifyPropertyChanged ItemViewModel पर है यदि आप उन गुणों को बदलते हैं तो अधिसूचनाएं होने की आवश्यकता होती है।

+0

तो, उदाहरण के लिए, यदि संपत्ति बदलने वाला पहलू ItemViewModel के लिए अप्रासंगिक था, तो क्या यह 'मॉडल' के लिए 'रीलेट' करने का अर्थ होगा? – Brap

+1

मुझे नहीं लगता कि आप ऐसा करके बहुत कुछ हासिल कर सकते हैं। इसे व्यूमोडेल के रूप में छोड़ दें, और केवल उन आइटम्स के लिए इवेंट हैंडलर को कॉल करें जिन्हें आपको चाहिए। इस तरह, आप घटना के लिए तैयार हैं कि आपको अधिसूचना को लागू करने की आवश्यकता होगी। – Robaticus

11

अंतर काफी सरल है।

मॉडल में व्यावसायिक तर्क है।
मॉडल में प्रेजेंटेशन तर्क शामिल है और इसके अतिरिक्त दृश्यों को फिट करने के लिए आकार दिया गया है।

आपके मामले में - मॉडल को लागू करें INotifyPropertyChanged लागू करें। वह शुद्ध प्रस्तुति तर्क है।

मॉडल एक विशेष यूआई सूचित करता है कि कुछ बदल गया है के लिए जिम्मेदार नहीं है, यह चालान के हस्तांतरण, मजदूरी आदि

कभी कभी (जब मॉडल सरल है) इस अमूर्त नहीं आवश्यक यह है की गणना करने के लिए जिम्मेदार है।


कुछ wiki उद्धरण:

मॉडल: क्लासिक MVC पैटर्न में के रूप में, मॉडल को संदर्भित करता है या तो
(क) एक ऑब्जेक्ट मॉडल है कि वास्तविक स्थिति सामग्री (एक वस्तु उन्मुख का प्रतिनिधित्व करता है दृष्टिकोण), या
(बी) डेटा एक्सेस परत जो उस सामग्री का प्रतिनिधित्व करती है (डेटा-केंद्रित दृष्टिकोण)।

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

10

यह पीछे एक ही सामान्य अवधारणा है सभी एमवी [x] आर्किटेक्चर, MVC ने एमवीपी या MVVM यद्यपि:

  • आप एक तरफ मॉडल है, जो मूल रूप से आपके व्यवसाय के डोमेन का सॉफ्टवेयर अमूर्त है। यह किसी यूआई से संबंधित सामानों के बारे में नहीं जानता और इसकी परवाह नहीं करता है (जैसे कि आपके मामले में 'परिवर्तनों के बारे में यूआई को सूचित करना')। यह व्यापार तर्क लागू करता है और यही वह है।
  • दूसरी तरफ आपके पास यूआई है, तकनीकी शर्तों में विशिष्ट आवश्यकताओं के साथ (जैसे 'डब्ल्यूपीएफ ObservableCollection' से जुड़ना चाहता है) और उपयोगकर्ता प्रस्तुति के मामले में भी सोचें (उदाहरण के लिए अलग-अलग दिनांक ऑर्डरिंग या विभिन्न दशमलव संकेतों के बारे में सोचें विभिन्न भाषाएं)।
  • इससे निपटने के लिए और इन आवश्यकताओं को स्पष्ट आर्किटेक्चर में स्पष्ट रूप से अलग करने में सक्षम होने के लिए, आपको [x], अपने मामले में ViewModel की आवश्यकता है। यह सॉफ्टवेयर के भीतर एकमात्र परत है जो यूआई और मॉडल दोनों के बारे में जानता है। अन्यथा, दोनों के बीच कोई संबंध नहीं होना चाहिए।

अपने सरल उदाहरण में, यह overkill की तरह लग सकता है, लेकिन एक सामान्य व्यापार सॉफ्टवेयर दर्जनों या इस तरह के एमवी [x] तीनो यहां तक ​​कि सैकड़ों होगा, और आप इस के बिना एक साफ वास्तुकला बनाए रखने के लिए कोई रास्ता नहीं होगा।

अपने प्रश्न का उत्तर देने के लिए: आपके उदाहरण में आपके पास वर्णित आर्किटेक्चर सेट अप करने के लिए केवल कुछ वायरिंग कोड है।

एचटीएच! थॉमस

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