以下是我的 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,所以我设置的方式就是这样。这是我能想到的唯一递归Hack。但这不是我的问题所在。我的问题是,当IsLeaf属性更改时,我想从ItemTemplate更改为GroupTemplate。这在第一次读取属性时非常有效。但是一旦此属性更改,模板选择器就不会重新应用。现在,我可以使用触发器来绑定该值并适当设置项模板,但我需要能够为每个项设置不同的模板,因为它们可能处于不同的状态。
例如,假设我有一个如下所示的组列表:
Group 1: IsLeaf = false,则template = GroupTemplate Group 2: IsLeaf = true,则template = ItemTemplate Group 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>