9

के साथ डेटा टेम्पलेट मेरे पास एक सामान्य नियंत्रण है जो व्यूमोडेल के अंदर प्रकार की संपत्ति के आधार पर एक संपादक प्रदर्शित करता है। वर्तमान में यह Control, ControlTemplate और इस तरह DataTrigger का उपयोग कर लागू हो जाता है -DataTrigger बनाम के साथ ControlTemplate। DataTemplateSelector

<Control 
    x:Name="MainControl" 
    Grid.Column="1" 
    TargetUpdated="OnTargetUpdated"> 
     <Control.Style> 
      <Style> 
       <Style.Triggers> 
        <DataTrigger 
         Binding="{Binding Path=EditorType}" 
         Value="{x:Static view:EditorType.Bool}"> 
         <Setter 
          Property="Control.Template" 
          Value="{StaticResource boolTemplate}" /> 
        </DataTrigger> 
        <DataTrigger 
         Binding="{Binding Path=EditorType}" 
         Value="{x:Static view:EditorType.Text}"> 
         <Setter 
          Property="Control.Template" 
          Value="{StaticResource textTemplate}" /> 
        </DataTrigger> 
        <DataTrigger 
         Binding="{Binding Path=EditorType}" 
         Value="{x:Static view:EditorType.Integer}"> 
         <Setter 
          Property="Control.Template" 
          Value="{StaticResource integerTemplate}" /> 
        </DataTrigger> 
        ... 
        .... 
       </Style.Triggers> 
      </Style> 
    </Control.Style> 
</Control> 

अब, उसी ContentPresenter, DataTemplate और इस तरह DataTemplateSelector का प्रयोग कर प्राप्त किया जा सकता है - का उपयोग कर DataTemplateSelector है

<local:EditorTemplateSelector 
    BoolEditorTemplate="{StaticResource boolTemplate}" 
    TextEditorTemplate="{StaticResource textTemplate}" 
    IntegerEditorTemplate="{StaticResource integerTemplate}" 
    ... 
    .... 
    x:Key="EditorTemplateSelector"> 
</local:EditorTemplateSelector> 

<ContentPresenter 
    ContentTemplateSelector="{Binding Source={StaticResource EditorTemplateSelector}}" 
    Content="{Binding}" 
    TargetUpdated="OnTargetUpdated"> 
</ContentPresenter> 

// Template selector returning appropriate template based on type 

मैं दूसरा दृष्टिकोण लग रहा है, बेहतर लेकिन आपसे जानना चाहते हैं -

  • कौन सा बेहतर है और क्यों?

  • क्या दो में कोई प्रदर्शन अंतर होगा?

+0

जो मैं इकट्ठा करता हूं, उससे दूसरा तरीका सर्वोत्तम अभ्यास माना जाता है। यह भी अधिक पठनीय है क्योंकि इसमें चयन का तर्क नहीं है (जिसे हमेशा सी # में परिभाषित किया जाना चाहिए)। हालांकि मैं प्रदर्शन बिंदु पर भी रूचि रखता हूं। –

उत्तर

9

मैंने सुना है कि DataTemplateSelectors अगर मूल्य वे परिवर्तन के आधार पर कर रहे हैं टेम्पलेट अद्यतन नहीं करते हैं, और इस वजह से मैं आमतौर पर उन्हें प्रयोग नहीं करते।

मेरी पसंदीदा विधि वास्तव में डेटा टेम्पलेट का उपयोग करने के लिए है।

<MyControl.Resources> 
    <DataTemplate TargetType="{x:Type local:BooleanModel}"> 
     <local:BooleanView /> 
    </DataTemplate> 
    <DataTemplate TargetType="{x:Type local:IntegerModel}"> 
     <local:IntegerView /> 
    </DataTemplate> 
    ... 
</MyControl.Resources> 

दूसरा, अगर मैं ऑब्जेक्ट प्रकार एक संपत्ति के बजाय के आधार पर टेम्पलेट बदलना चाहते हैं, मैं DataTriggers इस्तेमाल करते हैं। ऐसा इसलिए है क्योंकि यदि वह संपत्ति कभी भी बदल जाती है, तो PropertyChange अधिसूचना स्वचालित रूप से यूआई को बताएगी कि यह बदल गया है और टेम्पलेट को अपडेट करने के लिए। मुझे विश्वास नहीं है DataTemplateSelectors इसे स्वचालित रूप से करें। मैं अपने एक्सएएमएल में टेम्पलेट चयन तर्क देखना भी पसंद करता हूं, यह टेम्पलेट चयनकर्ता फ़ाइल में छिपा नहीं है, लेकिन यह सिर्फ व्यक्तिगत वरीयता है।

और मेरी आखिरी पसंद DataTemplateSelector का उपयोग करना है। मैं लगभग एक WPF अनुप्रयोग में कभी भी इसका उपयोग नहीं करता, हालांकि मैं अक्सर सिल्वरलाइट में करता हूं क्योंकि यह अंतर्निहित DataTemplates (अभी तक)

का उपयोग करने की मेरी पसंदीदा विधि का समर्थन नहीं करता है, हालांकि मुझे दोनों के बीच किसी भी महत्वपूर्ण प्रदर्शन अंतर के बारे में पता नहीं है, हालांकि अगर कोई मुझे अन्यथा बता सकता है तो मुझे दिलचस्पी होगी।

+0

दिलचस्प, मुझे यकीन है कि सवाल जिज्ञासा से बाहर डब्ल्यूपीएफ के बारे में था - क्या उन्होंने एसएल 4/5 में निहित टेम्पलेट्स को ठीक किया क्योंकि मुझे पता है कि वे पिछले संस्करणों में उपलब्ध नहीं थे। –

+0

@Dmitry मुझे विश्वास है कि मैंने पिछले सिल्वरलाइट प्रोजेक्ट को 4.0 में किया था, और अंतर्निहित डेटा टेम्पलेट्स तब काम नहीं कर पाए। मैंने सुना है कि वे 5.0 में काम करते हैं, लेकिन अभी तक यह नहीं है। 'DataTemplate चयनकर्ताओं के लिए – Rachel

+0

+1 यदि वे मान पर आधारित मान हैं तो टेम्पलेट को अपडेट नहीं करते हैं। मैंने इसे चेक किया और मान बदलते समय टेम्पलेट अपडेट नहीं होता है। धन्यवाद। – akjoshi

3

आप यहाँ दो सवाल :)

  1. कहाँ XAML (DataTriggers) में एक decsion बनाने के लिए या कोड TemplateSelector
  2. क्या आप पूरे Style या सिर्फ DataTemplate अधिभावी कर रहे हैं में है। आपके पहले नमूने में आप दूसरे एक - DataTemplate में Style ओवरराइड करते हैं।

Here're मेरी 2c:

मैं, ट्रिगर के साथ चिपके रहते हैं चाहते हैं के रूप में आप उन लोगों के साथ एक अपराजेय लचीलापन स्तर मिलेगा - नए संसाधन की कीमत और एक ट्रिगर सभी के लिए एक नए संपादक एक्सएएमएल - क्या बेहतर हो सकता है? DataTrigger उपयोग से संबंधित एक संभावित चेतावनी है - यह डेटा रिसाव का कारण बन सकती है।

Style बनाम DataTemplate की बात करते हुए मैं Style के साथ फिर से चिपक गया हूं। यह थोड़ा भारी दृश्य वृक्ष के रूप में हो सकता है, लेकिन यह आपको संपादकों के प्रदर्शन पर अंतिम नियंत्रण देगा।

विशेष रूप से, कुछ गुणों को केवल Style स्तर पर StyleSetters का उपयोग करके परिभाषित किया जा सकता है। तब परिभाषित करना @DataTemplate स्तर बस काम नहीं करेगा क्योंकि आपकी DataTemplate सामग्री आपके नियंत्रण कंटेनर का एक तत्काल बच्चा नहीं है (एक अतिरिक्त स्तर - एक्टुला नियंत्रण है)। यदि आपके पास ऐसी कोई संपत्ति नहीं है, तो ControlTemplates भी अच्छे हैं, और शायद तेज़ (?)।

+0

धन्यवाद दिमित्री, क्या आप 'डेटा ट्रिगर' के बारे में अधिक जानकारी प्रदान कर सकते हैं डेटा लीक का कारण बनता है? – akjoshi

+0

@akjoshi - क्षमा करें, मैं एक सटीक repro के साथ आने में सक्षम नहीं होगा, यह एक अवलोकन है, मैंने कुछ परियोजनाओं को देखा है जो ट्रिगर्स की संख्या को कम करने के बाद गंभीरता से लाभान्वित हैं। –

0

मैं सुझाव दूंगा कि उत्तर control आवश्यक है। आपको control के साथ कार्यक्षमता का पूरा समूह मिलता है जो वास्तव में DataTemplate के साथ उपलब्ध नहीं है। आप DependencyProperties, events, functions आदि आदि जोड़ सकते हैं लेकिन क्या आपको इसकी आवश्यकता है? यदि आप नहीं करते हैं तो एक नियंत्रण अधिक हो सकता है।

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