在运行时更改 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条评论
登录后参与评论

相关文章

来自分类Dev

使用WPF-MVVM在运行时扩展所有WPF TreeView节点

来自分类Dev

KendoUI:如何在运行时在TabStrip中插入TreeView

来自分类Dev

使用WPF-MVVM在运行时扩展所有WPF TreeView节点

来自分类Dev

如何防止TreeView 的DataTemplate 导致控件水平展开?

来自分类Dev

WPF TreeView DataTemplate 绑定与非嵌套类问题

来自分类Dev

在运行时更改字段属性

来自分类Dev

在运行时更改LSApplicationQueriesSchemes

来自分类Dev

Selenium xpath在运行时被更改

来自分类Dev

在运行时更改引导间隔

来自分类Dev

在运行时更改python mro

来自分类Dev

在运行时更改宏的值

来自分类Dev

可以在运行时更改AppDelegate

来自分类Dev

在运行时更改Java类

来自分类Dev

在运行时更改Guice绑定

来自分类Dev

在运行时更改.dll

来自分类Dev

在运行时更改堆栈大小

来自分类Dev

在运行时更改persistenceUnit属性

来自分类Dev

在运行时更改MPI设置

来自分类Dev

在运行时更改构建变体

来自分类Dev

在运行时更改注入的对象

来自分类Dev

在运行时更改网络接口

来自分类Dev

在运行时更改CoreNLP设置

来自分类Dev

在运行时更改按钮框架

来自分类Dev

在运行时更改按钮框架

来自分类Dev

在运行时更改背景颜色

来自分类Dev

在运行时更改.dll

来自分类Dev

在运行时更改堆栈大小

来自分类Dev

在运行时更改VideoView的大小

来自分类Dev

在运行时更改python mro