これが私が持っているXAMLです:
<ItemsControl ItemsSource="{Binding Path=Groups}" ItemTemplateSelector="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=ListTemplateSelector}"/>
これが私の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;
}
}
GroupTemplateデータテンプレートはそれ自体の内部でListTemplateSelectorを参照するため、これが私が設定したように設定した理由です。これは、私がまとめることができる唯一の再帰的ハックです。しかし、それは私が抱えている問題ではありません。
私の問題は、IsLeafプロパティが変更されたときにItemTemplateからGroupTemplateに変更したいということです。これは、プロパティを初めて読み取るため、初めて美しく機能します。ただし、このプロパティが変更されると、テンプレートセレクターは再適用されません。これで、トリガーを使用して値にバインドし、アイテムテンプレートを適切に設定できますが、状態が異なる可能性があるため、アイテムごとに異なるテンプレートを設定できる必要があります。
たとえば、次のようなグループのリストがあるとします。
グループ1:IsLeaf = false、つまりtemplate = GroupTemplate
グループ2:IsLeaf = true、つまりtemplate = ItemTemplate
グループ3:IsLeaf = false、つまりtemplate = GroupTemplate
また、グループ1のIsLeafプロパティがtrueに変更されると、テンプレートは自動的にItemTemplateに変更される必要があります。
編集:
これが私の一時的な解決策です。それを行うためのより良い方法はありますか?
<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>