在运行时更改TreeView的DataTemplate [英] Changing the DataTemplate of a TreeView in runtime

查看:66
本文介绍了在运行时更改TreeView的DataTemplate的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在WPF应用程序中有一个具有3个级别的TreeView.

I have a TreeView with 3 levels in my WPF application.

级别1和级别2具有自己的HierarchicalDataTemplate.级别3有其自己的DataTemplate.

Level 1 and level 2 have their own HierarchicalDataTemplate. Level 3 has its own DataTemplate.

这是XAML代码:

<Window.Resources>
    <HierarchicalDataTemplate x:Key="Level1Template" 
                          ItemsSource="{Binding Value}"
                          ItemTemplate="{StaticResource Level2RedTemplate}">
        <Border Background="Green">
            <TextBlock Text="Level1"/>
        </Border>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate x:Key="Level2RedTemplate"
                          ItemsSource="{Binding Value}"
                          ItemTemplate="{StaticResource Level3Template}">
        <Border Background="Red">
            <TextBlock Text="Level2"/>
        </Border>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate x:Key="Level2YellowTemplate"
                          ItemsSource="{Binding Value}"
                          ItemTemplate="{StaticResource Level3Template}">
        <Border Background="Yellow">
            <TextBlock Text="Level2"/>
    </HierarchicalDataTemplate>

    <DataTemplate x:Key="Level3Template">
        <Border Background="LightBlue">
            <TextBlock Text="Level3"/>
        </Border>
    </DataTemplate>

</Window.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Button Grid.Row="0"
            Content="Change Template"
            Click="ChangeTemplate" />

    <TreeView Grid.Row="1"
              Name="tv"
              ItemsSource="{Binding Items}"
              ItemTemplate="{StaticResource Level1Template}"/>
</Grid>

直到这里,它都可以正常工作. 问题开始了,当我想通过按窗口中的按钮来更改Level2项的DataTemplate时(请参见下图).

It works perfectly until here. The problem starts, when I want to change the DataTemplate of Level2 items by pressing a button in my window (see figure below).

我试图通过下面的代码(在按钮的事件处理程序中)为我的TreeView分配一个新的HierarchicalDataTemplate:

I tried to assign a new HierarchicalDataTemplate to my TreeView from code behind (in the event handler of the button) like this:

Private Sub ChangeTemplate()

    CType(tv.ItemTemplate, HierarchicalDataTemplate).ItemTemplate = CType(Me.FindResource("Level2YellowTemplate"), HierarchicalDataTemplate)

End Sub

这是不可能的,因为出现一个错误,即一旦使用(密封)了模板对象,就无法更改它."

This is not possible, as I get an error, that "as soon as a Template-Object is used (sealed), it cannot be changed."

有什么办法可以更改此模板吗?

Is there any way, that I can change this template?

推荐答案

由于@Bob的慷慨解囊,我解决了这样的问题:

Thanks to the helfupful comment from @Bob, I solved the problem like this:

我在UserControl中定义了一个属性,其中有TreeView.

I defined a property in the UserControl, where I have the TreeView.

我这样更改了级别1的HierarchicalDataTemplate:

I changed the HierarchicalDataTemplate of level 1 like this:

<HierarchicalDataTemplate x:Key="Level1Template" 
                      ItemsSource="{Binding Value}"
                      ItemTemplateSelector="{StaticResource MySelector}">
    <Border Background="Green">
        <TextBlock Text="Level1"/>
    </Border>
</HierarchicalDataTemplate>

我实现了MySelector类并实现了Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate函数.使用container,我可以访问我的UserControl及其属性.

I implemented the MySelector class and implemented the Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate function. Using the container, I could access my UserControl and its properties.

当我按下用户控件中的按钮时,TreeViewItemsSource会更改.每次更改后,都会调用TemplateSelector,因此将更新模板.

The ItemsSource of my TreeView changes when I press a button in my usercontrol. After each change, the TemplateSelector is called, and so the template is updated.

这篇关于在运行时更改TreeView的DataTemplate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆