2012-01-03 16 views
24

मैं DataTemplateSelector साथ ContentPresenter है:संपत्ति बदलते समय DataTemplateSelector को कैसे ट्रिगर करें?

... 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     var model = item as ItemControlViewModel; 

     if (model.CurrentStatus == PrerequisitesStatus.Required) 
     { 
      return RequiredTemplate; 
     } 

     if (model.CurrentStatus == PrerequisitesStatus.Completed) 
     { 
      return FinishedTemplate; 
     } 

     ... 

     return InProgressTemplate; 
    } 

जब CurrentStatus बदल गया है, OnPropertyChanged कहा जाता है।

मुझे इस डेटा टेम्पलेट चयनकर्ता को ट्रिगर करने के लिए किसी भी तरह की आवश्यकता है जब संपत्ति बदल दी जाती है और ContentPresenter DataTemplate को बदलती है। कोई सुझाव?

Threre इसी तरह के सवाल कर रहे हैं: 1 2, लेकिन मैं क्योंकि बहुत अधिक राज्यों के, किसी भी DataTriggers उपयोग करने के लिए नहीं करना चाहती।

DataTriggers

<ContentPresenter 
     Grid.Column="1" 
     Height="16" 
     Width="16" 
     Margin="3"> 
     <ContentPresenter.Triggers> 
      <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="0"> 
       <Setter Property="ContentPresenter.ContentTemplate" Value="{StaticResource ResourceKey=_requiredStatusTemplate}" /> 
      </DataTrigger> 
     </ContentPresenter.Triggers> 
    </ContentPresenter> 

के साथ खेलने की कोशिश की लेकिन एक त्रुटि मिली: ट्रिगर संग्रह सदस्यों मैं गलत हो सकता है प्रकार EventTrigger :(

+0

@ apt0r आप VisualStateManager का उपयोग कर के रूप में टेम्पलेट्स के लिए विरोध विचार किया है? –

+0

नहीं, मुझे लगता है कि यह यहां उपयुक्त नहीं है। मुझे संपत्ति नहीं, टेम्पलेट बदलने की जरूरत है। – rapt0r

+3

मेरे पास अतीत में एक ही समस्या थी और इसे काम करने के लिए डेटाट्रिगर्स पर स्विच किया गया था, मुझे नहीं लगता कि इसके लिए एक बेहतर समाधान है ... – SvenG

उत्तर

30

आप टिप्पणी में datatriggers साथ एक उदाहरण अनुरोध किया के रूप में, यहाँ आप कर रहे हैं:

एक FrameworkElement केवल EventTriggers हो सकता है, इसलिए प्राप्त होने वाले त्रुटि संदेश ट्रिगर संग्रह सदस्यों प्रकार EventTrigger का होना चाहिए

और सीधे सामग्री प्रदाता का भी उपयोग न करें, इसका उपयोग नियंत्रण टेम्पलेट के अंदर किया जाना है। जब आप गतिशील सामग्री चाहते हैं तो सामग्री कंट्रोल का बेहतर उपयोग करें। What's the difference between ContentControl and ContentPresenter?

और अंततः यहां आपके डेटा ट्रिगर मुद्दे पर एक सुझाव है। मैं इसे पुनर्प्रयोग के लिए एक शैली के अंदर डाल दिया है ....

XAML:

<Window x:Class="WpfApplication88.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 

    <DataTemplate x:Key="requiredTemplate"> 
     <TextBlock Text="requiredTemplate"></TextBlock> 
     <!--your stuff here--> 
    </DataTemplate> 

    <DataTemplate x:Key="completedTemplate"> 
     <TextBlock Text="CompletedTemplate"></TextBlock> 
     <!--your stuff here--> 
    </DataTemplate> 

    <Style x:Key="selectableContentStyle" TargetType="{x:Type ContentControl}"> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Required"> 
      <Setter Property="ContentTemplate" Value="{StaticResource requiredTemplate}" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Completed"> 
      <Setter Property="ContentTemplate" Value="{StaticResource completedTemplate}" /> 
     </DataTrigger> 
     <!-- your other Status' here --> 
     </Style.Triggers> 
    </Style> 

    </Window.Resources> 

    <Grid> 
    <ContentControl Width="100" Height="100" Style="{StaticResource selectableContentStyle}"/> 
    </Grid> 

</Window> 
+1

बढ़िया! बहुत धन्यवाद ;) – rapt0r

6

का होना चाहिए, लेकिन मेरा मानना ​​है कि DataTemplateSelector केवल प्रयोग किया जाता है जब ItemContainerGenerator संग्रह में जोड़े गए किसी आइटम के लिए एक कंटेनर बनाता है। क्योंकि एक संपत्ति मान में परिवर्तन होने पर एक नया कंटेनर उत्पन्न नहीं होता है, इसलिए नया DataTemplate कभी भी चयनकर्ता के माध्यम से लागू नहीं किया जा रहा है।

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

0

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

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