【发布时间】:2017-11-08 06:56:08
【问题描述】:
我的 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>
直到这里它都可以正常工作。 问题开始,当我想通过在我的窗口中按下一个按钮来更改Level2项目的DataTemplate时(见下图)。
我尝试从后面的代码(在按钮的事件处理程序中)为我的TreeView 分配一个新的HierarchicalDataTemplate,如下所示:
Private Sub ChangeTemplate()
CType(tv.ItemTemplate, HierarchicalDataTemplate).ItemTemplate = CType(Me.FindResource("Level2YellowTemplate"), HierarchicalDataTemplate)
End Sub
这是不可能的,因为我收到一个错误,即“一旦使用(密封)模板对象,它就无法更改。”
有什么方法可以改变这个模板吗?
【问题讨论】:
-
你应该看看
DataTemplateSelector。您将能够在运行时从一个模板切换到另一个模板。 -
@Bob 但我认为
DataTemplateSelector会根据我的数据的某些属性选择DataTemplate,对吗? -
是的。您打算如何选择新模板?
-
@Bob 我的数据/它的任何属性都不会改变。我只想更改模板。所以更详细地说:我更改了
ItemsSource(与旧的ItemsSource具有相同的类型),并且我想要这个新源的新模板。 -
好的,我不知道这是否可以这样做。但是如果你真的想遵循 MVVM 模式,你最好依靠你的属性来改变 DataTemplate => 这正是 MV 的目的......所以你将创建一个特定的属性来切换你的模板。跨度>
标签: .net wpf vb.net treeview itemscontrol