Così qui è il codice XAML che ho:WPF: Riapplicare DataTemplateSelector quando un certo valore cambia
<ItemsControl ItemsSource="{Binding Path=Groups}" ItemTemplateSelector="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=ListTemplateSelector}"/>
Ecco la mia classe ListTemplateSelector:
public class ListTemplateSelector : DataTemplateSelector {
public DataTemplate GroupTemplate { get; set; }
public DataTemplate ItemTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container) {
GroupList<Person> list = item as GroupList<Person>;
if (list != null && !list.IsLeaf)
return GroupTemplate;
return ItemTemplate;
}
}
Il modello di dati GroupTemplate fa riferimento al ListTemplateSelector al suo interno , quindi questo è il motivo per cui mi sono configurato come se lo avessi impostato. È l'unico trucco ricorsivo che potrei mettere insieme. Ma questo non è il problema che sto avendo.
Il mio problema è, voglio passare da ItemTemplate a GroupTemplate quando la proprietà IsLeaf cambia. Funziona magnificamente la prima volta da quando legge la proprietà la prima volta. Ma una volta modificata questa proprietà, il selettore modello non viene riapplicato. Ora, potrei usare i trigger per associare il valore e impostare il modello dell'articolo in modo appropriato, ma devo essere in grado di impostare un modello diverso per ciascun elemento, in quanto potrebbero trovarsi in uno stato diverso.
Ad esempio, dire che ho un elenco di gruppi come questo:
Gruppo 1: IsLeaf = false, in modo da template = GroupTemplate
Gruppo 2: IsLeaf = true, in modo da template = ItemTemplate
gruppo 3: IsLeaf = false, in modo da template = GroupTemplate
E una volta del gruppo 1 di IsLeaf modifiche di proprietà su true, il templat e deve cambiare automaticamente in ItemTemplate.
MODIFICA:
Ecco la mia soluzione temporanea. Qual è il modo migliore per farlo?
<ItemsControl ItemsSource="{Binding Path=Groups}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{DynamicResource ItemTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsLeaf}" Value="False">
<Setter Property="ContentTemplate" Value="{DynamicResource GroupTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Per chiarezza, hai scartato l'approccio DataTemplateSelector in favore di trigger o hai utilizzato i trigger nella soluzione anche con DataTemplateSelector? – alastairs
@alastairs Non posso parlare per OP, ma i trigger sembrano rendere inutile il DataTemplateSelector. – piedar