在运行时更改 TreeView 的 DataTemplate
Changing the DataTemplate of a TreeView in runtime
我的 WPF 应用程序中有一个 TreeView
具有 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>
到这里为止一切正常。 当我想通过按下 window 中的按钮更改 Level2 项目的 DataTemplate
时,问题开始了 (见下图)。
我试图从后面的代码(在按钮的事件处理程序中)为我的 TreeView
分配一个新的 HierarchicalDataTemplate
,如下所示:
Private Sub ChangeTemplate()
CType(tv.ItemTemplate, HierarchicalDataTemplate).ItemTemplate = CType(Me.FindResource("Level2YellowTemplate"), HierarchicalDataTemplate)
End Sub
这是不可能的,因为我得到一个错误,"as soon as a Template-Object is used (sealed), it cannot be changed."
有什么办法可以更改此模板吗?
感谢@Bob 的热心评论,我解决了这个问题:
我在 UserControl
中定义了一个 属性,其中我有 TreeView
.
我把1级的HierarchicalDataTemplate
改成这样:
<HierarchicalDataTemplate x:Key="Level1Template"
ItemsSource="{Binding Value}"
ItemTemplateSelector="{StaticResource MySelector}">
<Border Background="Green">
<TextBlock Text="Level1"/>
</Border>
</HierarchicalDataTemplate>
我实现了MySelector
class,实现了Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
功能。使用 container
,我可以访问我的 UserControl
及其属性。
当我按下用户控件中的按钮时,TreeView
的 ItemsSource
会发生变化。每次更改后,都会调用 TemplateSelector
,从而更新模板。
我的 WPF 应用程序中有一个 TreeView
具有 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>
到这里为止一切正常。 当我想通过按下 window 中的按钮更改 Level2 项目的 DataTemplate
时,问题开始了 (见下图)。
我试图从后面的代码(在按钮的事件处理程序中)为我的 TreeView
分配一个新的 HierarchicalDataTemplate
,如下所示:
Private Sub ChangeTemplate()
CType(tv.ItemTemplate, HierarchicalDataTemplate).ItemTemplate = CType(Me.FindResource("Level2YellowTemplate"), HierarchicalDataTemplate)
End Sub
这是不可能的,因为我得到一个错误,"as soon as a Template-Object is used (sealed), it cannot be changed."
有什么办法可以更改此模板吗?
感谢@Bob 的热心评论,我解决了这个问题:
我在 UserControl
中定义了一个 属性,其中我有 TreeView
.
我把1级的HierarchicalDataTemplate
改成这样:
<HierarchicalDataTemplate x:Key="Level1Template"
ItemsSource="{Binding Value}"
ItemTemplateSelector="{StaticResource MySelector}">
<Border Background="Green">
<TextBlock Text="Level1"/>
</Border>
</HierarchicalDataTemplate>
我实现了MySelector
class,实现了Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
功能。使用 container
,我可以访问我的 UserControl
及其属性。
当我按下用户控件中的按钮时,TreeView
的 ItemsSource
会发生变化。每次更改后,都会调用 TemplateSelector
,从而更新模板。