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レベルの深さになるデータがあります...データオブジェクトのタイプは、2レベルまたは3レベルのブランチの一部になるように設定されているかどうかによって異なります。これが、テンプレートとアイテムのソースを条件付きで設定する必要がある理由です。これはできますか

4

1 に答える 1

4

あなたの説明からあなたのデータがどのように見えるかはよくわかりませんが、あなたが望むものは各アイテムでそれらの間で選択することで異なる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バインディングを持つ2つの単純なテンプレートが必要です。

<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 に答える