2010-07-04 15 views
6

सिल्वरलाइट 4 बाहर है और यह हम फिर से इस रिलीज में DataTemplate डेटा प्रकार कार्यक्षमता नहीं छूटा है लगता है, जो MVVM समर्थन IMHO के लिए बहुत निर्णायक है। मेरे डब्ल्यूपीएफ ऐप्स के लिए, इस बिंदु पर, मैं अपने आवेदन के लिए अपने विचारों के लिए डेटा टेम्पलेट्स को विश्व स्तर पर जोड़ने के लिए बहुत उपयोग करता हूं। मेरे संबंधित व्यू मॉडल्स के लिए डेटाटाइप के साथ स्रोत:सिल्वरलाइट 4 DataTemplate डेटा प्रकार

यानी।

<DataTemplate DataType="{x:Type viewModels:myViewModel}"> 
<views:myView/> 
</DataTemplate> 

मैं इस दृष्टिकोण की तरह है, क्योंकि मेरे सारे बाध्य ViewModels स्वचालित रूप से जब मैं अपने दृश्य ViewModels का संग्रह करने के लिए बाध्य में कुछ ItemSource है सही सामग्री को प्रदर्शित ... विशेष रूप से उपयोगी ... यह, उदाहरण के लिए, होगा स्वचालित रूप से एक TabControl एक Collection<SomeViewModel> प्रदर्शित करता है SomeViewModel से संबद्ध दृश्य करने के लिए बाध्य में सुनिश्चित करें कि प्रत्येक टैब बनाते हैं।

कुछ बातें मैं SL 3 के लिए करने की कोशिश की शामिल हैं:

  • एक "DataTemplatePresenterContentControl" जो स्वचालित रूप से सामग्री जब नियंत्रण

  • लोड होने के एक TypeConverter का उपयोग के लिए एक DataTemplate लागू होता है बनाना, पर गतिशील रूप से लागू किया नियंत्रण लोड, दृश्य पेड़ डेटा बाध्य वस्तुओं

  • एक शैली का उपयोग करते हुए की तलाश में चलते समय, नियंत्रण लोड पर गतिशील रूप से लागू किया, दृश्य पेड़ देख रहा पर चलते हुए डेटा के लिए जी बाध्य वस्तुओं

हालांकि, इन तरीकों में से कोई भी वास्तव में स्थिति मैं एक स्वीकार्य रास्ता है, जो वास्तव में महत्वपूर्ण है में ऊपर उल्लेख किया संबोधित करते हैं।

तो, के बाद से यह अभी भी सिल्वरलाइट 4 में बॉक्स से बाहर संभव नहीं है, मुझे पता है कि अगर किसी को भी अभी तक कुछ उचित विकल्प के साथ आ गया सराहनीय होगा।

धन्यवाद।

उत्तर

8

तरह से मैं वाणिज्यिक परियोजनाओं के एक जोड़े में ऐसा प्रकार है:

मैं एक मानक IValueConverter

public class ViewTemplateChooser : IValueConverter 
{ 
    /// <summary> 
    /// Modifies the source data before passing it to the target for display in the UI. 
    /// </summary> 
    /// <returns> 
    /// The value to be passed to the target dependency property. 
    /// </returns> 
    /// <param name="value">The source data being passed to the target.</param><param name="targetType">The <see cref="T:System.Type"/> of data expected by the target dependency property.</param><param name="parameter">An optional parameter to be used in the converter logic.</param><param name="culture">The culture of the conversion.</param> 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value is MyViewModel) 
     { 
      return new MyView { DataContext = value }; 
     } 

     return value; 
    } 

    /// <summary> 
    /// Modifies the target data before passing it to the source object. This method is called only in <see cref="F:System.Windows.Data.BindingMode.TwoWay"/> bindings. 
    /// </summary> 
    /// <returns> 
    /// The value to be passed to the source object. 
    /// </returns> 
    /// <param name="value">The target data being passed to the source.</param><param name="targetType">The <see cref="T:System.Type"/> of data expected by the source object.</param><param name="parameter">An optional parameter to be used in the converter logic.</param><param name="culture">The culture of the conversion.</param> 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

कनवर्टर एक namespace पंजीकरण

xmlns:Converters="clr-namespace:YourProject.Converters" 

तब की आवश्यकता होगी है आप अपने संसाधन अनुभाग में कनवर्टर का संदर्भ देते हैं:

<UserControl.Resources> 
    <Converters:ViewTemplateChooser x:Key="TemplateChooser" /> 
</UserControl.Resources> 

और अंत में मैं कनवर्टर का उपयोग दृश्य ViewModel

<ContentControl Content="{Binding Workspace, Converter={StaticResource TemplateChooser}}" Margin="5,35,5,5" Grid.Column="1" /> 

कनवर्टर नेविगेशन रणनीतियों को लागू करने के लिए संशोधित किया जा सकता है करने के लिए सेट की DataContext के साथ एक दृश्य में ViewModel कन्वर्ट करने के लिए, मैं उदाहरण करने की कोशिश की यथासंभव सरल।

मुझे उम्मीद है कि इससे मदद मिलती है, आपको चरम सीमाओं या तीसरे पक्ष के पुस्तकालयों में जाना नहीं है - जो आप ढूंढ रहे हैं उसे प्राप्त करने के लिए।

1

WPF और Silverlight में, मैं प्रिज्म का उपयोग करते हैं। मुझे लगता है कि यह प्रकारों के आधार पर विचारों को बदलने के लिए अधिक बहुमुखी है। इसे छीनने के लिए थोड़ा सा जरूरी है, लेकिन एक बार यह अंदर आने के बाद, संभावनाएं अनंत हैं।

संपादित

मैं अपने ViewModel में एक संपत्ति के लिए RegionName बाध्यकारी (हो सकता है GetType()। नाम अगर आप चाहते हैं) करके करते हैं। फिर, मैं नामों के लिए प्रकार पंजीकृत करता हूं, और यह बस काम करता है।

एक ListBox की तरह कुछ के मामले में, मैं होने के लिए डेटा टेम्पलेट की स्थापना:

<ContentControl Regions:RegionManager.RegionName="{Binding SomeName}" /> 

आप नहीं करते हैं, वस्तु आप के लिए बाध्य कर रहे हैं पर होना SomeName चाहते करने पर विचार करें एक ValueConverter कि प्रकार का नाम देता है:

<ContentControl Regions:RegionManager.RegionName="{Binding SomeName, Converter={StaticResource ObjectToTypeConverter}}" /> 

क्या इससे मदद मिलती है?

+0

मैं भी प्रिज्म के क्षेत्र प्रबंधक का उपयोग कर रहा हूं, लेकिन क्या आप यह बता रहे हैं कि आप यह कैसे कर रहे हैं इसके बारे में कुछ और बता सकते हैं? – Jeff

+0

उपरोक्त मेरे संपादन में विस्तार है। –

+0

हाँ, धन्यवाद। मुझे दृष्टिकोण पसंद है। लेकिन यह अभी भी ऊपर बताए गए एक मुद्दे को संबोधित नहीं करता है; एक आईनेमेरेबल के लिए बाध्यकारी - उदाहरण के लिए एक संग्रह पर एक टैबकंट्रोल बाध्यकारी और प्रत्येक टैब को MyViewForMyViewModelClass UserControl प्रदर्शित करने की उम्मीद है। या क्या इसका समर्थन करने के लिए आपके दृष्टिकोण को अनुकूलित करने का कोई तरीका है? धन्यवाद। – Jeff

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