如何在运行时以编程方式更改与WPF TreeView关联的HierarchicalDataTemplate?

时间:2011-09-19 12:51:26

标签: wpf treeview wpf-controls

我的WPF窗口上有一个TreeView控件。我只从窗口给出相关的XAML。

<Window.Resources>
        <HierarchicalDataTemplate x:Key="HierarchicalTemplate" ItemsSource="{Binding SubOrgUnitItems}">
            <StackPanel Orientation="Horizontal">
                <Image Height="16" Source="{Binding ImagePath}" Stretch="Fill" Width="16"/>
                <TextBlock Text="{Binding OrgUnitName}" Name="treeText" />
            </StackPanel>
        </HierarchicalDataTemplate>
    </Window.Resources>



<TreeView Margin="10,35,10,10" BorderThickness="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ScrollViewer.VerticalScrollBarVisibility="Auto"
                      IsTabStop="True" Name="orgTreeView" ItemsSource="{Binding}"  ItemTemplate="{DynamicResource HierarchicalTemplate}" TabIndex="700" SelectedItemChanged="orgTreeView_SelectedItemChanged" />

当组织集合绑定到DataContext的{​​{1}}时,项目会以TreeView的值显示为每个节点的文本。 现在,在运行时,我想在每个节点上看到一些其他属性的值作为文本。例如OrgUnitName代替OrgUnitCode。两者都是在与树视图关联的视图模型类中声明的属性。

如何在运行时以编程方式执行此操作?

2 个答案:

答案 0 :(得分:0)

我已经实现了我想做的事情,但不幸的是通过一些努力。以下事情对我有用,但可能不是问题的正确答案。

我又添加了一个HirerachicalDataTemplateTreeView。新模板使用OrgUnitCode属性。新树视图使用新模板。

<HierarchicalDataTemplate x:Key="HierarchicalTemplateUsingCode" ItemsSource="{Binding SubOrgUnitItems}">
            <StackPanel Orientation="Horizontal">
                <Image Height="16" Source="{Binding ImagePath}" Stretch="Fill" Width="16"/>
                <TextBlock Text="{Binding OrgUnitCode}" Name="treeText" />
            </StackPanel>
        </HierarchicalDataTemplate>



<TreeView Margin="10,35,10,10" BorderThickness="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ScrollViewer.VerticalScrollBarVisibility="Auto"
                      IsTabStop="True" Name="orgTreeViewCode" ItemsSource="{Binding}"  ItemTemplate="{DynamicResource HierarchicalTemplateUsingCode}" TabIndex="700" SelectedItemChanged="orgTreeViewCode_SelectedItemChanged"  Visibility="Hidden"/>

在运行时,当我想在节点上看到OrgUnitCode属性值作为文本时,我只是让新树可见并隐藏第一个(提到的问题)。因此,使树视图可见/不可见有助于我实现我想要做的事情。

答案 1 :(得分:0)

您应该使用HierarchicalDataTemplateSelector

定义两个不同的HierarchicalDataTemplate(正如您所做的那样)。

DataTemplateSelector继承自定义选择器类,覆盖其SelectTemplate方法并将选择的逻辑放在那里。此方法将在每种情况下返回正确的模板。

在xaml文件中创建资源(自定义选择器类)。

TreeView s ItemTemplateSelector设置为静态选择器资源。

请在此处查看一个简单示例:Link