在运行时更改TreeView的DataTemplate

时间:2017-11-08 06:56:09

标签: .net wpf vb.net treeview itemscontrol

我的WPF应用程序中有{3}级TreeView

1级和2级有自己的HierarchicalDataTemplate。 3级有自己的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时(请参见下图)。 enter image description here

我尝试从后面的代码(在按钮的事件处理程序中)为我的HierarchicalDataTemplate分配一个新的TreeView,如下所示:

Private Sub ChangeTemplate()

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

End Sub

由于我收到错误,这是不可能的,“只要使用(密封)模板对象,就无法更改。”

有什么办法可以改变这个模板吗?

1 个答案:

答案 0 :(得分:1)

感谢@Bob的好评,我解决了这个问题:

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

我改变了第1级的HierarchicalDataTemplate

<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及其属性。

当我在用户控件中按下按钮时,ItemsSource的{​​{1}}会发生变化。每次更改后,都会调用TreeView,因此模板会更新。