Come avevo anticipato nel post precedente vorrei esporre un tip per poter selezionare un template per rappresentare un determinato dato in base ad una condizione.
Supponiamo di avere una situazione simile al post precedente, in cui ho un ViewModel che mi rappresenta un ordine: OrderViewModel. Voglio rappresentare OrderViewModel in tre modi diversi in base al fatto che esso rappresenti la scheda di un ordine, un ordine in modifica o un ordine nuovo.
Per fare ciò implemento tre View diverse con tre UserControl e le associo ad altrettanti ControlTemplate nel seguente modo:
<ControlTemplate x:Key="OrderDetailTemplate" TargetType="{x:Type Control}">
<View:OderDetailView />
</ControlTemplate>
<ControlTemplate x:Key="OrderCreationTemplate" TargetType="{x:Type Control}">
<View:OrderCreationView />
</ControlTemplate>
<ControlTemplate x:Key="OrderModifyTemplate" TargetType="{x:Type Control}">
<View:OderModifyView />
</ControlTemplate>
Perchè faccio tre ControlTemplate? Perchè in questo modo posso creare un DataTemplate associato ad OrderViewModel che carica il template corretto a seconda della condizione definita prima in questo modo:
<DataTemplate DataType="{x:Type ViewModel:OrderViewModel}">
<Control x:Name="control" Template="{StaticResource OrderDetailTemplate}" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsModifying}" Value="True">
<Setter TargetName="control" Property="Template"
Value="{StaticResource OrderModifyTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsNew}" Value="True">
<Setter TargetName="control" Property="Template"
Value="{StaticResource OrderCreationTemplate}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Come si vede dal codice XAML per cambiare il Template associato al Control, usato dal DataTemplate per visualizzare il mio OrderViewModel, è sufficiente definire dei DataTrigger che verificano le proprietà di interesse (nel mio caso IsModifying e IsNew).
Un DataTrigger permette di definire delle condizioni sulle proprietà dell'oggetto rappresentato dal DataTemplate; quando la condizione è verificata vengono eseguiti i Setter contenuti al suo interno, che si occupano si settare il valore Value alla proprietà Property dell'elemento TargetName. Si deve tenere conto che i DataTrigger vengono eseguiti in cascata; vince quindi l'ultima condizione verificata. Nel mio caso è importante tenere conto dell'ordine perchè nel Model quando la proprietà IsNew è True, risulta True anche la proprietà IsModifying. Per ovviare all'inconveniente di avere più condizioni vere simultaneamente avrei potuto usare dei MultiDataTrigger per mettere più condizioni in And, in modo da renderle mutuamente esclusive.
Matteo