没有HierarchicalDataTemplate.触发器支持到ItemsSource和ItemTemplate的条件
本文关键字:ItemTemplate 条件 ItemsSource HierarchicalDataTemplate 触发器 支持 没有 | 更新日期: 2023-09-27 17:58:05
以下xaml生成编译时错误:在类型"System.Windows.Controls.ContentPresenter"上找不到模板属性"ItemsSource"
<HierarchicalDataTemplate x:Key="tvTemplate">
<TextBlock Text="{Binding Path=Name}"/>
<HierarchicalDataTemplate.Triggers>
<DataTrigger Binding="{Binding HasSubCat1}" Value="True">
<Setter Property="ItemsSource" Value="{Binding SubCategories1}" />
<Setter Property="ItemTemplate" Value="{Binding subCat1Template}" />
</DataTrigger>
<DataTrigger Binding="{Binding HasSubCat1}" Value="False">
<Setter Property="ItemsSource" Value="{Binding SubCategories2}" />
<Setter Property="ItemTemplate" Value="{Binding subCat2Template}" />
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>
</UserControl.Resources>
基本上,我有数据显示时会有两层或三层深。。。数据对象的类型将不同,这取决于它是2级或3级分支的一部分。这就是为什么我需要有条件地设置模板和项目源。这可以在中完成吗
从您的描述中不太确定您的数据到底是什么样子,但我认为您想要的是不同的HierarchicalDataTemplates
,每个项目都有一个DataTemplateSelector
可供选择。选择器只需要根据数据项上的一些值在模板之间切换,比如DataTriggers试图做的事情:
public class CategoryTemplateSelector : DataTemplateSelector
{
public DataTemplate Cat1Template { get; set; }
public DataTemplate Cat2Template { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
return ((CategoryBase)item).HasSubCat1 ? Cat1Template : Cat2Template;
}
}
然后,您需要两个简单的模板,每个模板都有不同的ItemsSource
绑定:
<HierarchicalDataTemplate x:Key="tvTemplate1" ItemsSource="{Binding SubCategories1}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="tvTemplate2" ItemsSource="{Binding SubCategories2}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
然后在您的TreeView
上,而不是设置ItemTemplate
,使用选择器:
<TreeView.ItemTemplateSelector>
<local:CategoryTemplateSelector Cat1Template="{StaticResource tvTemplate1}" Cat2Template="{StaticResource tvTemplate2}"/>
</TreeView.ItemTemplateSelector>