2011-08-24 23 views
17

मुझे समझ में समस्या हो रही है कि सूची/संग्रह शामिल होने पर एमवीवीएम पैटर्न को कैसे लागू किया जाए।मैं संग्रह के साथ एमवीवीएम कैसे बना सकता हूं?

कहें कि मेनमोडेल में कुछ गुण और विधियां हैं, साथ ही साथ एक सूची जिसमें अन्य DetailModel ऑब्जेक्ट्स हैं। DetailModel ऑब्जेक्ट्स को जोड़ा, हटाया जा सकता है, या फिर से ऑर्डर किया जा सकता है।

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

अंत में, एक मुख्य दृश्य मॉड्यूल है। इसमें मेनमोडेल के गुणों और विधियों का समर्थन किया गया है, जो मुख्य दृश्य से बंधे हैं, सिंक में सबकुछ रखते हुए परिवर्तन अधिसूचना के साथ। (इस बिंदु तक, मैं पैटर्न के साथ सहज हूं - अगर कुछ मौलिक है तो मुझे यह बताते हुए ... और

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

दो सूचियों का प्रबंधन कैसे करना चाहिए (DetailModels और DetailViewModels)? मैं वास्तव में उलझन में हूं क्योंकि मैं शुरुआत में DetailViewModel सूची को पॉप्युलेट करता हूं, और उन्हें सिंक्रनाइज़ करने के लिए आइटमों को जोड़ने, हटाने या बदलने के तरीके को कैसे संभालना चाहिए!

उत्तर

9

आमतौर पर Models डेटा ऑब्जेक्ट्स से अधिक कुछ नहीं है। उन्हें किसी सूची से आइटम जोड़ने/निकालने जैसी चीजों को करने के लिए कोई कोड नहीं होना चाहिए। यह ViewModel's नौकरी है।

आपके मामले में, मैं एक MainViewModel निम्नलिखित गुण है कि बनाना होगा:

  • ObservableCollection<DetailViewModel> Details
  • ICommand AddDetailCommand
  • ICommand RemoveDetailCommand

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

आपका MainViewModelDetailViewModels की प्रारंभिक सूची बनाने का प्रभारी है, और यह इन वस्तुओं को जोड़ने/हटाने का भी प्रभारी है। उदाहरण के लिए, MainViewModel.MainModel संपत्ति के लिए PropertyChanged घटना में, यह MainViewModel.Details संग्रह के पुनर्निर्माण सकता है, और MainViewModel.Details संपत्ति के लिए CollectionChanged घटना को अपडेट करेंगे MainViewModel.MainModel.Details

+1

यह काफी सुंदर समाधान का संक्षेप में संक्षेप में वर्णन करता है। मेरे "MainViewModel" में चयनित आइटम को सूची में ऊपर या नीचे स्थानांतरित करने के लिए आदेश भी हैं ... – mbmcavoy

4

आपको अलग DetailModels सूची और DetailViewModels सूची का अधिकार है। DetailViewModels सूची ObservableCollection<DetailViewModel> प्रकार की संपत्ति होनी चाहिए। आप मॉडल (या निर्माण समय में, यदि आप अपने ViewModel के निर्माता में मॉडल गुजरती हैं।)

private ObservableCollection<DetailViewModel> m_details; 
public IEnumerable<DetailViewModel> Details 
{ 
    get { return m_details; } 
} 

आप m_details की सदस्यता ले सकते सेट जब आप नमूदार सूची को पॉप्युलेट कर सकते हैं। CollectionChanged। यह वह जगह है जहां आप मॉडल में सूची की सामग्री को पुन: क्रमबद्ध कर सकते हैं।

मुझे उम्मीद है कि इससे मदद मिलती है।

2

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

आमतौर पर, एक मास्टर वी एम के निर्माता इस तरह दिखेगा:

public MasterViewModel(MasterModel m) 
{ 
    _Model = m; 
    _Detail = new ObservableCollection<DetailViewModel>(m.Detail); 
} 

जहां MasterModel.DetailDetailModel वस्तुओं का संग्रह है, और _Detail एक Detail संपत्ति उस दृश्य के संपर्क में है के लिए एक समर्थन क्षेत्र है।

जहाँ तक जोड़कर, निकालकर, और इस सूची में आइटम को पुन: क्रम का संबंध है, यूआई कम से कम इस MasterViewModel पर आदेशों के माध्यम से किया जाएगा, जो MasterModel.Detail और MasterViewModel.Detail दोनों में हेरफेर करना होगा के रूप में। यह दर्द का थोड़ा सा है, लेकिन जब तक आप MasterModel.Detail पर प्रत्येक परिवर्तन के बाद MasterViewModel.Detail को दोबारा नहीं बदलना चाहते हैं, तो यह वास्तव में अपरिहार्य है।

दूसरी तरफ, यदि आप सोच रहे हैं कि "मुझे मॉडल देखने के लिए यूनिट परीक्षण क्यों लिखने की आवश्यकता होगी?", अब आप जानते हैं।

+0

मैं अभी भी अपने समाधान बाहर काम कर रहा हूँ, लेकिन मैं यहाँ में एक बड़ा सहायक का कहना चाहते थे: के लिए हर परिवर्तन के बाद MasterViewModel.Detail फिर से आबाद " MasterModel.Detail "विचित्र रूप से, यह विचार मेरे लिए नहीं हुआ था! मुझे निश्चित रूप से इसे शुरू करने के बाद इसे बनाना होगा, इसलिए मैं किसी भी समय पुनर्निर्माण कर सकता हूं। – mbmcavoy

+2

मैं सोच रहा हूं कि 'नया अवलोकन योग्य चयन (m.Detail); 'm.Detail' के बाद से काम करेगा, ' के रूप में निर्दिष्ट प्रकार के मुकाबले एक अलग प्रकार का है, ObservableCollection जेनेरिक के माध्यम से। _ मुझे संदेह है कि यह काम करेगा। –

1

यहाँ एक जवाब मैं पतों लगता है कि इस मामले को बहुत अच्छी तरह से एक ObservableViewModelCollection<TViewModel, TModel>

उपयोग कर रहा है

यह अच्छा और आलसी है। यह ctor में एक ObservableCollection और एक ViewModelFactory लेता है। मुझे यह पसंद है क्योंकि यह मॉडल परत पर राज्य रखता है जहां यह संबंधित है। जीयूआई पर उपयोगकर्ता संचालन वीएम पर कमांड का आह्वान कर सकता है जो एम पर सार्वजनिक तरीकों के माध्यम से एम में हेरफेर कर सकता है। एम परत पर किसी भी परिणामी परिवर्तन स्वचालित रूप से इस लिंक में कक्षा द्वारा संभाला जाएगा।

https://stackoverflow.com/q/2177659/456490

नोट SL बनाम WPF के बारे में मेरी टिप्पणी

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