在运行时更改 TreeView 的 DataTemplate

伊冯尼拉

我有一个TreeView在我的WPF应用程序3个层次。

级别 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>

直到这里它都能完美运行。问题开始了,当我想DataTemplate通过按下窗口中的按钮来更改Level2 项目时(见下图)。在此处输入图片说明

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

Private Sub ChangeTemplate()

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

End Sub

这是不可能的,因为我收到一个错误,即“一旦使用(密封)模板对象,就无法更改它。”

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

伊冯尼拉

感谢@Bob 的有益评论,我解决了这样的问题:

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

HierarchicalDataTemplate像这样更改了级别 1:

<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,我可以访问 myUserControl及其属性。

ItemsSource我的TreeView变化,当我在我的用户按下一个按钮。每次更改后,TemplateSelector都会调用 ,从而更新模板。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章