3

以下 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 级分支的一部分。这就是为什么我需要有条件地设置模板和项目源。这可以做到吗

4

1 回答 1

4

从您的描述中不太确定您的数据到底是什么样的,但我认为您想要的不同HierarchicalDataTemplatesDataTemplateSelector可以在每个项目中选择它们。选择器只需要根据数据项上的某些值在模板之间切换,例如您的 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;
    }
}

然后,您需要 2 个简单的模板,每个模板都有不同的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>
于 2013-02-06T18:37:20.040 回答