我有一个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] 删除。
我来说两句