在运行时更改TreeView的DataTemplate [英] Changing the DataTemplate of a TreeView in runtime
问题描述
我在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.
当我按下用户控件中的按钮时,TreeView
的ItemsSource
会更改.每次更改后,都会调用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屋!