【问题标题】:Changing the DataTemplate of a TreeView in runtime在运行时更改 TreeView 的 DataTemplate
【发布时间】: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


【解决方案1】:

感谢@Bob 的精彩评论,我解决了这样的问题:

我在UserControl 中定义了一个属性,其中有TreeView

我像这样更改了级别 1 的 HierarchicalDataTemplate

<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 及其属性。

当我按下用户控件中的按钮时,TreeViewItemsSource 会发生变化。每次更改后,都会调用TemplateSelector,从而更新模板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2016-06-08
    相关资源
    最近更新 更多