【问题标题】:How to change HirerachicalDataTemplate associated with the WPF TreeView programatically at run time?如何在运行时以编程方式更改与 WPF TreeView 关联的 HierarchicalDataTemplate?
【发布时间】:2011-11-20 05:40:15
【问题描述】:

我的 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" />

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

如何在运行时以编程方式进行?

【问题讨论】:

    标签: wpf treeview wpf-controls


    【解决方案1】:

    你应该使用HierarchicalDataTemplateSelector。

    定义两个不同的HierarchicalDataTemplate(和你一样)。

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

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

    将TreeViews ItemTemplateSelector 设置为静态选择器资源。

    在这里看一个简单的例子:Link

    【讨论】:

    • 接受作为答案。谢谢 ! :) 你知道我们是否可以在运行时修改现有的HierarchicalDataTemplate?例如修改在HierarchicalDataTemplate XAML 资源中声明的TextBlock 的Binding 属性。
    【解决方案2】:

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

    我又添加了一个HirerachicalDataTemplate 和TreeView。新模板使用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 属性值作为文本时,我只是让新树可见并隐藏第一个树(有问题提到)。因此,使树视图可见/不可见有助于我实现我想做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2016-02-18
      相关资源
      最近更新 更多