2011-07-14 11 views
7

मेरे पास एक काफी बुनियादी WPF UI है जिसके द्वारा उपयोगकर्ता अनुरोध मेरे टैबकंट्रोल में एक नया टैब खोलने का कारण बनता है। TabControl इस तरह एक ObservableCollection<ViewModelBase>व्यूमोडेल प्रबंधन (डिजाइनटाइम बनाम रन टाइम) के बारे में प्रश्न

के लिए बाध्य है मैं इस संग्रह के लिए ViewModel उदाहरणों जोड़ने के लिए, और इसी टैब की सामग्री आधारित प्रदर्शित किया जाता है टेम्पलेट्स पर:

<DataTemplate DataType="{x:Type viewModels:UserUploadsViewModel}"> 
     <userControls:UserUploads /> 
    </DataTemplate> 

अब मान लीजिए कि को नियंत्रित UserUploads की है कि अंदर मैं जाने XAML में एक वीएम ऊपर तार की डिजाइन के साथ मदद करने के लिए इस तरह, चाहेंगे:

<UserControl x:Class=".....UserUploads" 
    ..... 
    DataContext="{Binding Source={StaticResource ViewModelLocater}, 
        Path=UserAdministrationViewModel}"> 

यह गुण एक वी एम को लाइव सेवाओं के साथ कार्यावधि में डिजाइन समय में नकली डेटा के साथ एक वी एम वापस आ जाएगी, और।

प्रश्न: क्या यह एक्सएएमएल एक व्यूमोडेल इंस्टेंस में टैबइटम सामग्री को बाध्य करने में क्या कर रहा है, और सही डेटा प्रस्तुत करने के लिए उपरोक्त डेटा टेम्पलेट पर निर्भर करता है? यदि हां, तो क्या इन दोनों अवधारणाओं को एक साथ काम करने का कोई तरीका है?

उत्तर

22

ऐसा करने का एक आसान तरीका है। एक DesignTimeUserAdministrationViewModel है और निर्माता में स्थिर डेटा से पॉप्युलेट और उल्लेख है कि UserControl में के रूप में:

<UserControl d:DataContext="{d:DesignInstance designTimeVMs:DesignTimeUserAdministrationViewModel, IsDesignTimeCreatable=True}"> 

इस तरह आप एक डिजाइन समय परीक्षण डाटा d:DataContext और क्रम को लाइव वास्तविक DataContext करने के लिए बाध्य डेटा करने के लिए बाध्य है। अधिक जानकारी here

+0

यह बहुत अच्छा लग रहा है। तो यदि यह डिज़ाइन का समय है, तो (डिज़ाइन टाइम व्यू मॉडल) ऑब्जेक्ट को वायर्ड किया जाएगा, लेकिन रनटाइम पर यह कुछ भी नहीं करेगा? –

+1

हां, यह मिश्रणशीलता के लिए जोड़ा गया है। – anivas

+0

शानदार! 'IsDesignTimeCreatable = True' का उपयोग डेटा के साथ दृश्य को पॉप्युलेट करेगा। यदि 'गलत' पर सेट किया गया है, तो यह केवल डेटा के "आकार" प्रदान करेगा, जो डिजाइनर में पूर्ण डेटा बाध्यकारी समर्थन देता है, बजाय अंधेरे से बाध्यकारी। साथ ही, आप '{d: DesignData} 'के साथ उदाहरण डेटा को पूरी तरह से निर्दिष्ट करने के लिए .xaml फ़ाइल का उपयोग कर सकते हैं। देखें [वाकथ्रू: डिज़ाइनर में डेटा टू बाइंड टू डिज़ाइन इनस्टैंडेंस का उपयोग करना] (http://msdn.microsoft.com/en-us/library/dd490796 (VS.100) .aspx) और [Walkthrough: नमूना डेटा का उपयोग करना डब्ल्यूपीएफ डिजाइनर] (http://msdn.microsoft.com/en-us/library/ee823176 (v = vs.100) .aspx) – cod3monk3y

1

हाँ मुझे लगता है कि अपने मौजूदा सेटअप

ViewModelLocator एक स्थिर वर्ग है कि डिजाइन समय में एक डमी वस्तु, और रनटाइम पर एक स्थिर ViewModel देता है के साथ हस्तक्षेप करेगा। इसका मतलब है कि

  • ViewModelLocator नहीं, बल्कि आपके ParentViewModel, अपने TabViewModels

  • आप (ViewModel) एक ही बार में खुला एक ही टैब के कई उदाहरण

  • आप ओपन प्रबंधन नहीं कर सकते नहीं कर सकते हैं/बंद टैब जब तक आप UserControl का संदर्भ नहीं देते हैं, जो एमवीवीएम सिद्धांत का उल्लंघन है जहां व्यूमोडेल को

  • का पता नहीं है, तो आप नई प्रतियों को तुरंत चालू नहीं कर सकते पैरामीटरयुक्त कन्स्ट्रक्टर के साथ TabViewModel का। उदाहरण के लिए, OpenTabs.Add(new CustomerViewModel(CustomerId));

शायद एक विकल्प कनवर्टर हो सकता है? एक जो स्थिर समय देता है यदि डिजाइन समय में, या रनटाइम के दौरान बाध्य वस्तु? मैंने कभी ऐसी चीज का परीक्षण नहीं किया है लेकिन सिद्धांत में इसे काम करना चाहिए :)

1

एमएस सामान में बनाया बुरा नहीं है, लेकिन एक और अधिक सुरुचिपूर्ण और संरचना की दृष्टि से ध्वनि विकल्प है जो मैं अपने प्रोजेक्ट में व्यस्त को शामिल कर रहा हूँ है: http://msdn.microsoft.com/en-us/magazine/dn169081.aspx

मूल रूप से, आप SimpleIoc कंटेनर के साथ MVVM लाइट टूलकिट का उपयोग यह निम्नलिखित तीन परिदृश्यों के लिए डेटा की सेवा करने की क्षमता के साथ आता है और समाप्त होता है:

डिज़ाइन का समय, रन टाइम और टेस्ट टाइम।

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

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