2012-10-30 16 views
12

Ho un controllo elemento associato a Attività. Ogni attività ha lo stato di attività. Ho definito diversi modelli di dati per ogni stato di attività e anche un selettore di modelli di dati.Modifica modello di dati dinamicamente

Il problema è che non sono in grado di capire come attivare il selettore modello dati quando lo stato dell'attività viene modificato dinamicamente.

Desidero sapere come utilizzare i trigger di dati insieme ai modelli di dati.

Se questo non funzionerà, io esplorare altre alternative come ad esempio
1. proprietà associata legata al compito dello Stato. Qualsiasi modifica imposterà dinamicamente il modello di dati.
2. visivo State Manager

+0

forse questa risposta si adatta anche per voi http://stackoverflow.com/questions/8715315/how-to-trigger-datatemplateselector-when-property-changes – michele

+0

hanno guardato questo risposta già. Questo può funzionare, ma sembra un po 'complesso. Alla ricerca di una soluzione più semplice. – Tilak

+0

La domanda potrebbe essere duplicata con [how-to-trigger-datatemplateselector-when-property-changes] (https://stackoverflow.com/questions/8715315/how-to-trigger-datatemplateselector-when-property-changes) e [ ControlTemplate con DataTrigger vs. DataTemplate con DataTemplateSelector] (https://stackoverflow.com/questions/8926024/controltemplate-with-datatrigger-vs-datatemplate-with-datatemplateselector) – huoxudong125

risposta

40

Un DataTemplateSelector non risponde al PropertyChange notifiche, in modo da non arrivare rivalutato quando le proprietà cambiano.

L'alternativa che utilizzo è DataTriggers che modifica lo Template in base a una proprietà.

Ad esempio, questa attirerò tutti TaskModel oggetti usando un ContentControl, e il ContentControl.Template si basa sulla TaskStatus proprietà del 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 non sembra avere un membro targetType. Mi sto perdendo qualcosa? –

+0

@JakeGaston Stai usando Silverlight? Non credo che DataTemplates impliciti (quelli con solo set TargetType) siano implementati in Silverlight fino al 4.5. – Rachel

3

Solo una breve nota per tutti coloro che pensano che questa incredibilmente utile come ho fatto io -

Attualmente con WPF, sembra che si vorrà utilizzare DataType piuttosto che TargetType sulle definizioni 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> 
Problemi correlati