क्या मेरे सभी व्यूमोडल्स को SimpleIoc में स्टोर करना सही है? उदाहरण के लिए मेरे पास तीन पेज मेनपेज, फोटो, डायरेक्टरीज़ (इसलिए तीन व्यू मॉडेल -> मेनवीएम, फोटोवीएम, डायरेक्टरीजवीएम) हैं। क्या मुझे प्रत्येक पृष्ठ में DataContext को ViewModelLocator या घोंसला ViewModels में मुख्य संपत्ति में गुणों के रूप में देखने के लिए डेटा कॉन्टेक्स्ट सेट करना चाहिए और प्रत्येक पृष्ठ को डेटाकॉन्टेक्स्ट को मुख्य में जोड़ना चाहिए। फोटोवोम्प्रर्टी, मुख्य। डायरेक्टरीज वीएमप्रोपर्टी और इसी तरह? क्या कोई मुझे आईओसी के विचार और उद्देश्य की व्याख्या कर सकता है?ViewModelLocator में ViewModels MVVM लाइट
उत्तर
सबसे पहले, की सुविधा देता है क्या ViewModelLocator करता है पर देखो और कारण है कि हम इसका इस्तेमाल:
ViewModelLocator हमारे App.xaml पृष्ठ पर एक वस्तु के रूप में घोषित और एक आवेदन सिंगलटन है। हमारे पास एक होने वाला है, और उनमें से केवल एक ही एप्लिकेशन के लिए उपलब्ध होने पर उपलब्ध है।
ViewModelLocator एमवीवीएम लाइट में हमारे सभी व्यू मॉडल्स का स्रोत है। प्रत्येक व्यूमोडेल के लिए हमारे पास ViewModelLocator पर एक संपत्ति होगी जो हमें दृश्य के लिए व्यूमोडेल प्राप्त करने की अनुमति देती है। इस कोड को इस तरह दिखता है:
public class ViewModelLocator
{
public MainPageViewModel MainPage
{
get { return new MainPageViewModel(); }
}
}
यह मेरा App.xaml का एक टुकड़ा है:
<Application.Resources>
<vm:ViewModelLocator
x:Key="ViewModelLocator" />
</Application.Resources>
यह View.xaml
से एक टुकड़ाDataContext="{Binding MainPage, Source={StaticResource ViewModelLocator}}"
अब तक तो अच्छा है। अपने पहले प्रश्न का उत्तर देने के लिए, क्या आपको एमवीवीएम लाइट में आईओसी का उपयोग करना है? नहीं। ViewModelLocator द्वारा पूरी तरह से निर्मित और तत्काल आपके दृश्य में आपके व्यूमोडेल को कोई आवश्यकता नहीं है।
अब, आपके दूसरे प्रश्न पर: आईओसी का उद्देश्य क्या है?
MVVM लाइट के साथआप इस तरह से ऊपर कार्य करें::
आईओसी आपको निम्न कार्य करने की अनुमति देने के लिए बनाया गया है
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
}
else
{
SimpleIoc.Default.Register<IDataService, DataService>();
}
SimpleIoc.Default.Register<MainViewModel>();
}
public MainViewModel Main
{
get { return SimpleIoc.Default.GetInstance<MainViewModel>(); }
}
}
public class MainViewModel
{
public ObservableCollection<Foo> Foos { get; set; }
public MainViewModel(IDataService dataService)
{
_dataService=dataService;
Foos=_dataService.GetFoos();
}
}
जब मैं अपने MainViewModel हल जब मैं फोन
SimpleIoc.Default.GetInstance<MainViewModel>()
आंतरिक रूप से क्या होता है यह है कि SimpleIoc यह देखने के लिए जांच करता है कि मेनव्यूमोडेल की कोई निर्भरता है (इसके निर्माता में पैरामीटर)। इसके बाद यह उन मानदंडों को हल करके इन पैरामीटर को हल करने का प्रयास करता है जो इसके साथ पंजीकृत हैं। यह रिकर्सिवली करता है, इसलिए यदि DataService निर्भरता था यह instantiated और DataService निर्माता जब यह रूप में अच्छी तरह instantiated किया जा रहा था के लिए पारित किया जाएगा।
मैं यह सब क्यों करूँगा?
- अपनी कक्षाओं आसानी से इकाई बनाने परीक्षण योग्य
- अपने कोड इंटरफ़ेस संचालित करें। इसका मतलब है कि आप कंक्रीट कक्षाओं के बजाय इंटरफेस का संदर्भ दे रहे हैं
- अपना कोड कम से कम युग्मित करें। इसका मतलब यह है कि कोई इंटरफ़ेस और कक्षाओं के कार्यान्वयन को बदल सकता है जो उपभोग करते हैं कि इंटरफेस परवाह नहीं है और फिर से कोडित नहीं किया जाना चाहिए।
- अपने वर्ग निर्भरताओं को एक स्वचालित तरीके से हल करें।
- एमवीवीएम लाइट में, आप देखेंगे कि यह डिज़ाइन मोड (
ViewModelBase.IsInDesignModeStatic
) में चल रहा है, इसका मतलब यह है कि आप अपने व्यूमोडेल डेटा प्रदान करने के लिए डिज़ाइन-टाइम सेवाएं बना सकते हैं ताकि विजुअल स्टूडियो में आपका दृश्य वास्तविक डेटा हो ।
उत्कृष्ट ब्रेक डाउन और विषय वस्तु का जवाब। धन्यवाद। – usefulBee
बिल्कुल सही, मेरे बहुत सारे समय बचाया। – Ahmed
... और यदि आपने कभी सोचा है कि क्या आपका इनपुट लाइन के नीचे वर्षों से मायने रखता है, हाँ यह करता है। यह * बिल्कुल * टूटने का तरीका है और इसके माध्यम से चलने से मुझे यह समझने में मदद मिली कि क्या हो रहा है। धन्यवाद! – Fred
एमवीवीएम लाइट में बहुत अच्छी सुविधाएं हैं लेकिन ऐसा लगता है कि सेवा लोकेटर दृश्य मॉडल पर विचारों की अवांछित निर्भरता बनाता है। आदर्श रूप से, मैं लाइब्रेरी ए में व्यूमोडेलोकेटर, लाइब्रेरी बी में दृश्य मॉडल और लाइब्रेरी सी में विचार देखना चाहता हूं। फिर मैं भविष्य की परियोजनाओं के लिए आवश्यकतानुसार मिश्रण और मिलान कर सकता हूं। हालांकि, एमवीवीएम लाइट के डिजाइन में, जहां तक मैं देख सकता हूं, दृश्य (लाइब्रेरी सी) हमेशा ViewModelLocator पर निर्भरता रखेगा (यह ठीक है) लेकिन क्योंकि ViewModelLocator (लाइब्रेरी ए) हमेशा पर निर्भरता रखेगा मॉडल (लाइब्रेरी बी) देखें, फिर विचार हमेशा दृश्य मॉडल पर निर्भर होंगे (यह ठीक नहीं है क्योंकि दृश्य में अब सभी दृश्य मॉडल पुस्तकालयों को शामिल करना होगा, जिनका उपयोग कभी भी सभी उत्पादों के साथ किया जाता था)।
मुझे विश्वास है कि प्रिज्म किसी भी तरह स्ट्रिंग कुंजियों का उपयोग करके इस समस्या को हल करता है। क्या मैं कुछ भूल रहा हूँ?
ओह! मुझे लगता है कि मैंने अभी अपने प्रश्न का उत्तर दिया है। समाधान लाइब्रेरी ए, सर्विस लोकेटर, एक विशेष समाधान (उत्पाद) के लिए विशिष्ट बनाना है। इसके बाद केवल उस समाधान के लिए दृश्य मॉडल का संदर्भ शामिल है। फिर विचार इस सेवा लोकेटर पर निर्भर करते हैं जो बदले में उस उत्पाद के सभी दृश्य मॉडल पर निर्भर करता है। अंतिम परिणाम यह है कि विचार केवल उन दृश्य मॉडल पर निर्भर करते हैं जिनका उपयोग उस उत्पाद के लिए किया जाएगा। आपके साथ कोई समस्या नहीं है कि हम प्रत्येक समाधान के लिए ServiceLocator को डुप्लिकेट कर रहे हैं क्योंकि इस मॉड्यूल में केवल कोड है जो समाधान के लिए विशिष्ट है। ServiceLocator के घटक जैसे कि सरल Ioc क्लास, सभी समाधानों के लिए आम हैं, लेकिन इन्हें पुन: प्रयोज्य कक्षाओं में शामिल किया गया है जिसे हम ServiceLocator में आमंत्रित करते हैं।
चीजों को सारांशित करने के लिए, जिस समस्या को मैं हल करने की कोशिश कर रहा हूं, वह मान लीजिए कि एक समाधान में 6 दृश्य मॉडल हैं, जिनमें से चार निकट से संबंधित हैं और जिनमें से दो निकट से संबंधित हैं। इसलिए हम दो असेंबली बनाते हैं, जिनमें प्रत्येक निकट से संबंधित दृश्य मॉडल होते हैं। मान लें कि हम ऐसे उत्पाद को डिज़ाइन करते हैं जो दृश्य मॉडल के एक सेट का उपयोग करता है और समाधान को विंडोज 8 चलाने के लिए डिज़ाइन किया गया है। अब विचार सभी अलग हैं और हम दृश्य मॉडल के केवल एक सेट (असेंबली) का पुन: उपयोग करना चाहते हैं। तो हम सिर्फ एक नई सर्विसलोकेटर असेंबली बनाते हैं जो दृश्य मॉडल के इस असेंबली और हमें आवश्यक किसी भी अन्य व्यक्ति को इंगित करता है। हमारे नए विंडोज 8 विचार अब इस नए सर्विसलोकेटर असेंबली पर निर्भर करते हैं और केवल हमारे मॉडल (समाधान) में उपयोग किए जाने वाले दृश्य मॉडल पर निर्भर करते हैं।
- 1. SelectionChanged घटना सिल्वरलाइट + MVVM लाइट
- 2. MVVM लाइट में DataService और IDataService के प्रयोजन के
- 3. ViewModels
- 4. MVVM लाइट => दर्रा कमान पैरामीटर और EventArgs
- 5. एमवीवीएम लाइट
- 6. MVVMLight ViewModelLocator dataservice
- 7. mvvm
- 8. MVVM
- 9. सरल एमवीवीएम लाइट उदाहरण
- 10. DataTemplate चालित MVVM
- 11. एमवीवीएम लाइट टूलकिट और यूनिटी 2.0
- 12. मान्यता ASP.NET MVC में ViewModels पर
- 13. डब्ल्यूपीएफ एमवीवीएम लाइट यूनिट परीक्षण व्यू मॉडल्स
- 14. MVVM मानकीकरण
- 15. MVVM विरासत
- 16. एमवीवीएम लाइट मैसेंजर
- 17. एमवीवीएम लाइट टूलकिट
- 18. एमवीवीएम लाइट टूलकिट लागू करना WPF एकता
- 19. संपत्ति 'IsDataSource' प्रकार में नहीं मिला था 'ViewModelLocator
- 20. एमवीवीएम लाइट रिले कॉमांड पैरामीटर
- 21. गुम सिस्टम। विन्डोज़। सिल्वरलाइट 4 में इंटरएक्टिविविटी - एमवीवीएम लाइट ट्यूटोरियल
- 22. Mojolicious :: लाइट
- 23. ईथरपैड लाइट
- 24. मेट्रो में समूहबद्ध आइटम पेज के साथ अच्छी तरह से काम करने के लिए एमवीवीएम लाइट कैसे प्राप्त कर सकता हूं?
- 25. सी ++ faq लाइट में त्रुटियां?
- 26. लाइट थीम में एंड्रॉइड टैबविड्ज
- 27. पहुँच MVVM संग्रह
- 28. MVVM - बाहर निकलें पुष्टि
- 29. mvvm-light Messenger
- 30. Wpf UserControl और MVVM
मुझे आशा है कि इससे आपकी मदद मिलेगी: http://stackoverflow.com/questions/13795596/best-tutorial-to-learn-mvvmlight-simpleioc-use – User1551892
क्या आप अपने दूसरे दृष्टिकोण से संबंधित कुछ कोड प्रदान कर सकते हैं? मेनव्यूमोडेल में आप फोटोवंप्रोपर्टी को कैसे परिभाषित करते हैं ... आपका प्रश्न बहुत दिलचस्प है ... – User1551892