Tuesday, 15 February 2011

c# - Dynamically set UserControl as Listbox DataTemplate body -


मेरे पास निम्न सेटअप है:

  & lt; ListBox ItemSource = "{बाध्यकारी लक्ष्य} "& gt; & LT; ListBox.ItemTemplate & gt; & LT; DataTemplate & gt; & Lt; दृश्य: देखेंनाम / & gt; & Lt; / DataTemplate & gt; & LT; /ListBox.ItemTemplate> & Lt; / ListBox & gt;   

मैं जो काम पूरा करने का प्रयास कर रहा हूं वह गतिशील रूप से तय करना है कि रनटाइम पर किस दृश्य का उपयोग करना है, यह DataContext में ListBox कोड>। सरल शब्दों में, मैं & lt; दृश्य: ViewName & gt; को एक डेटा बाइंडिंग के साथ बदलना चाहता हूं जो उचित दृश्य देता है।

मैं अपने ऐप के लिए प्लग-इन्स प्रदान करने के लिए MEF का उपयोग करता हूं उचित होने पर आइटम प्रदर्शित करने के लिए कस्टम दृश्य प्रदान करने की आवश्यकता हो सकती है डिजाइन समय पर मुझे सभी संभावित दृश्य प्रकार (वे गतिशील रूप से डीएलएल से लोड किए जा सकते हैं) नहीं जानते हैं, इसलिए एक सरल DataTemplateSelector ऐसा नहीं करेगा।

मैंने समाधान शोध किया है लेकिन खाली आ चुका है।

DataTemplateManager से आप कुछ ऐसा कर सकते हैं:

  डेटाटाइमप्लेटमैनैजर। पंजीयकडेटाप्लेट & lt; ViewModelType1, ViewType1 & gt; (); डेटाटाइमप्लेट प्रबंधक। पंजीयकडेटाप्लेट & lt; ViewModelType2, व्यू-टाइप 2 & gt; (); डेटाटाइमप्लेट प्रबंधक। पंजीयकडेटाप्लेट & lt; ViewModelType3, ViewType3 & gt; ();   

तब आप लिस्ट बॉक्स से ItemTemplate निकालना चाहते हैं:

  & lt; लिस्ट बॉक्स आइटमस्सोर्स = "{बाध्यकारी लक्ष्य}" / & gt;   

और लिस्ट बॉक्स दृश्य मोडेल में आप यह कर सकते हैं:

  सार्वजनिक शून्य AddTargets () {लक्ष्य। जोड़ें (नया ViewModelType1 ()); लक्ष्य। जोड़ें (नया व्यूमोल्डटाइप 2 ()); लक्ष्य। जोड़ें (नया दृश्यमॉडलटाइप 3 ()); }   

फिर, प्रत्येक DataTemplate स्वचालित रूप से प्रत्येक संबंधित ViewModel को प्रस्तुत करने के लिए WPF द्वारा उपयोग किया जाएगा।

यह भी ध्यान रखें कि आप DataTemplateManager.RegisterDataTemplate () सूची बॉक्स को दिखाने से पहले किसी भी समय, ताकि आप सैद्धांतिक रूप से ऐसा कर सकते हैं जब एमईएफ भागों को लोड करते हैं।

संपादित करें:

आपकी टिप्पणी के आधार पर , आप व्यू मॉोडल में किसी संपत्ति के अनुसार चयनित व्यू को प्रदर्शित करने के लिए एक सामग्री प्रस्तुति के साथ एक एकल डेटाटामप्लेट बना सकते हैं:

  & lt; डेटाटाइमप्लेट डेटाटाइप = "{x: स्थानीय टाइप करें: लक्ष्य दृश्यमॉडेल}" & gt; & Lt; ContentPresenter x: name = "MainContentPresenter" सामग्री = "{बाध्यकारी}" ContentTemplate = "{बाध्यकारी आपकी प्रॉपर्टी, कनवर्टर = कुछ कनॉन्टर}" / & gt;   

और SomeConverter के अंदर आपको एक ही तकनीक का उपयोग करना चाहिए जैसा कि पोस्ट में दिखाया गया है, ताकि डेटाटाइमेट को गतिशील रूप से जनरेट किया जा सके।

No comments:

Post a Comment