2012-10-30 17 views
12

Mam kontrolę nad przedmiotami, która jest powiązana z Zadaniami. Każde zadanie ma stan zadania. Mam zdefiniowane różne szablony danych dla każdego stanu zadania, a także selektor szablonów danych.Dynamicznie zmieniaj szablon danych

Problem polega na tym, że nie jestem w stanie wymyślić, jak wyzwolić selektor szablonów danych, gdy stan zadania zmienia się dynamicznie.

Chcę wiedzieć, jak używać wyzwalaczy danych wraz z szablonami danych.

Jeśli to nie zadziała, sprawdzę inne alternatywy, takie jak
1. Załączony obiekt przypisany do stanu zadania. Każda zmiana spowoduje dynamiczne ustawienie szablonu danych.
2. Stan wizualny Menedżer

+0

może ta odpowiedź pasuje również do ciebie http://stackoverflow.com/questions/8715315/how-to-trigger-datatemplateselector-when-property-changes – michele

+0

Wyglądał w tej odpowiedzi już. To może działać, ale wygląda na nieco skomplikowane. Poszukuję prostszego rozwiązania. – Tilak

+0

Pytanie może być powielone z [jak-to-wyzwalacz-datatemplateselector-when-property-changes] (https://stackoverflow.com/questions/8715315/how-to-trigger-datatemplateselector-when-property-changes) i [ ControlTemplate z DataTrigger Vs. DataTemplate z DataTemplateSelector] (https://stackoverflow.com/questions/8926024/controltemplate-with-datatrigger-vs-datatemplate-with-datatemplateselector) – huoxudong125

Odpowiedz

40

DataTemplateSelector nie reaguje na PropertyChange zgłoszeń, więc nie dostać ponownie ocenione, gdy właściwości zmienić.

Alternatywą, której używam jest DataTriggers, która zmienia Template na podstawie właściwości.

Na przykład, przyciągnę wszystkich TaskModel obiektów za pomocą ContentControl, a ContentControl.Template opiera się na własności TaskStatus z 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

hmm, DataTemplate nie ma elementu targetType. Czy czegoś brakuje? –

+0

@JakeGaston Czy korzystasz z Silverlight? Nie sądzę, implicite DataTemplates (te z tylko zestaw TargetType) są realizowane w Silverlight do 4.5. – Rachel

3

Tylko szybka uwaga dla każdego, kto znalazł ten bardzo pomocny jak ja -

Obecnie z WPF, wygląda na to będziemy chcieli użyć dataType zamiast TargetType na swoich definicjach DataTemplate:

<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> 
Powiązane problemy