2012-10-30 23 views
12

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

समस्या यह है कि मैं डेटा टेम्पलेट चयनकर्ता को ट्रिगर करने के तरीके को समझने में सक्षम नहीं हूं जब कार्य स्थिति गतिशील रूप से बदल जाती है।

मैं जानना चाहता हूं कि डेटा टेम्पलेट्स के साथ डेटा ट्रिगर्स का उपयोग कैसे करें।

यदि यह काम नहीं करेगा, तो मैं
जैसे अन्य विकल्पों का पता लगाऊंगा 1. संलग्न संपत्ति कार्य स्थिति से जुड़ी हुई है। कोई भी परिवर्तन गतिशील रूप से डेटा टेम्पलेट सेट करेगा।
2. दृश्य राज्य प्रबंधक

+0

शायद इस सवाल का जवाब आप http://stackoverflow.com/questions/8715315/how-to-trigger-datatemplateselector-when-property-changes के लिए भी फिट होगा – michele

+0

पहले से ही इस सवाल का जवाब को देखा। यह काम कर सकता है, लेकिन थोड़ा जटिल लग रहा है। सरल समाधान की तलाश में है। – Tilak

+0

प्रश्न शायद [कैसे-टू-ट्रिगर-डेटामैप्लेट्स चयनकर्ता-कब-संपत्ति-परिवर्तन] के साथ डुप्लीकेट किया गया है (https://stackoverflow.com/questions/8715315/how-to-trigger-datatemplateselector-when-property-changes) और [ DataTrigger बनाम के साथ ControlTemplate DataTemplateSelector के साथ डेटा टेम्पलेट] (https://stackoverflow.com/questions/8926024/controltemplate-with-datatrigger-vs-datatemplate-with-datatemplateselector) – huoxudong125

उत्तर

40

एक DataTemplateSelector, PropertyChange अधिसूचना का जवाब नहीं है तो यह फिर से मूल्यांकन जब अपने गुणों में परिवर्तन नहीं मिलता है।

मैं जिस विकल्प का उपयोग करता हूं वह DataTriggers है जो एक संपत्ति के आधार पर Template बदलता है।

उदाहरण के लिए, यह एक ContentControl का उपयोग करके सभी TaskModel वस्तुओं आकर्षित करेगा, और ContentControl.Template किसी के लिए भी TaskModel

<DataTemplate x:Key="OpenTaskTemplate" TargetType="{x:Type local:TaskModel}"> 
    <TextBlock Text="I'm an Open Task" /> 
</DataTemplate> 

<DataTemplate x:Key="ClosedTaskTemplate" TargetType="{x:Type local:TaskModel}"> 
    <TextBlock Text="I'm a Closed Task" /> 
</DataTemplate> 

<DataTemplate DataType="{x:Type local:TaskModel}"> 
    <ContentControl Content="{Binding }"> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 

       <!-- Default Template --> 
       <Setter Property="ContentTemplate" Value="{StaticResource OpenTaskTemplate}" /> 

       <!-- Triggers to change Template --> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding TaskStatus}" Value="Closed"> 
         <Setter Property="ContentTemplate" Value="{StaticResource ClosedTaskTemplate}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</DataTemplate> 
+0

हम्म, डेटा टेम्पलेट में एक लक्ष्य टाइप सदस्य नहीं लगता है। क्या मैं कुछ भूल रहा हूँ? –

+0

@ जेक गैस्टन क्या आप सिल्वरलाइट का उपयोग कर रहे हैं? मुझे नहीं लगता कि निहित डेटा टेम्पलेट्स (केवल टार्गेट टाइप के साथ वाले) को सिल्वरलाइट में 4.5 तक लागू किया गया है। – Rachel

3

बस एक क्विक नोट की TaskStatus संपत्ति है कि के रूप में मैंने किया था यह अविश्वसनीय रूप से उपयोगी पाया पर आधारित है -

WPF साथ

वर्तमान में, यह है कि आप अपने DataTemplate परिभाषा पर डेटा प्रकार बजाय TargetType का उपयोग करना चाहेंगे दिखता है:

<DataTemplate x:Key="OpenTaskTemplate" DataType="{x:Type local:TaskModel}"> 
    <TextBlock Text="I'm an Open Task" /> 
</DataTemplate> 

<DataTemplate x:Key="ClosedTaskTemplate" DataType="{x:Type local:TaskModel}"> 
    <TextBlock Text="I'm a Closed Task" /> 
</DataTemplate> 
संबंधित मुद्दे