所以这是我拥有的 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,因此模板 = GroupTemplate
第 2 组:IsLeaf = true,因此模板 = ItemTemplate
第 3 组:IsLeaf = false,因此模板 = 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>