2011-01-11 22 views
5

alt textपहुँच MVVM संग्रह

के भीतर से जनक दृश्य मॉडल चित्र के ऊपर मेरा कार्यक्रम को दिखाता है। तीर Binding इंगित करता है।

मेरा मेनविंडो.एक्सएएमएल का डाटाकॉन्टेक्स्ट MainVM के रूप में सेट है।

विंडो में एक टैब नियंत्रण ObservableCollectionViewModel एस से जुड़ा हुआ है। डेटा टेम्पलेट का उपयोग करके, टैब नियंत्रण ViewModel से संबंधित दृश्य प्रदर्शित करता है।

ObservableCollectionMainVM में पाया गया है।

में ViewModel (ObservableCollection में संलग्न) से प्राप्त गुणों का उपयोग कैसे करें?

मैं उन उत्तरों के लिए खुला हूं जिनके लिए मेरे प्रोग्रामिंग मॉडल में संशोधन की आवश्यकता है।

उत्तर

6

केंट ने जो कहा, उस पर बिल्डिंग। । ।

एक वास्तुशिल्प दृष्टिकोण से, आपके व्यूमोडेल क्लास को मेनवीएम के बारे में कुछ भी जानने की आवश्यकता नहीं है। जो कुछ भी उसे जानने की जरूरत है उसे व्यूमोडेल के उदाहरण में पारित किया जाना चाहिए ताकि वह परमाणु रह सके, और इसे कॉल करने वाली चीज़ों के बारे में चिंता न करें। एक ठोस दृष्टिकोण से, यह निर्भरता उलटा सिद्धांत है।

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

एक ओवरकिल विधि (जिसे मैं अनुशंसा नहीं करता), कन्स्ट्रक्टर में this में गुजरने के लिए अपने कन्स्ट्रक्टर को स्थापित कर रहा है। उदा .:

public class ViewModel 
{ 
    private readonly MainVM _parent; 

    public MainVM Parent => _parent; 

    public ViewModel(MainVM parent) 
    { 
      _parent = parent; 
    } 
} 

तो आप अपने ViewModel तुम सिर्फ कर सकते हैं बनाते समय:

ViewModel vm = new ViewModel(this); 
+1

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

+0

यह ओवरकिल क्यों है? मैं परमाणु वीएम के विचार से सहमत हूं, लेकिन इसी तरह के माता-पिता संबंध उदाहरण में ((डेटारो) पंक्ति में है) .बल –

2

ViewModel के उदाहरण कौन बनाता है? यदि MainVM और ViewModel के बीच एक सख्त संबंध है तो शायद ViewModel को इसके निर्माता में MainVM का उदाहरण लेना चाहिए।

विकल्प एक अलग डिज़ाइन के साथ आना है जिसके लिए ViewModelMainVM तक पहुंच प्राप्त करने की आवश्यकता नहीं है। ऐसा करने के लिए अधिक जानकारी (और एक अलग सवाल) की आवश्यकता होगी।

4

आपको कितनी बातचीत की आवश्यकता है, इस पर निर्भर करते हुए, आप ViewModel कक्षा से घटनाओं को फायर करके दूसरी तरफ जा सकते हैं और मेनवीएम उन्हें संभालने और व्यक्तिगत रूप से ViewModel पर गुण सेट कर सकते हैं।

एक अन्य विकल्प होगा जब आप ViewModel संग्रह (जो मुझे लगता है MainVM कहीं? में किया जाता है) का दृष्टांत, तो आप सिर्फ एक निर्माता पैरामीटर के रूप में MainVM में गुजरती हैं और रखने के लिए और प्रत्येक ViewModel के अंदर MainVM का उदाहरण हो सकता है।