代码之家  ›  专栏  ›  技术社区  ›  Andy

选择TreeView项时更改其模板

  •  3
  • Andy  · 技术社区  · 15 年前

    我在更改选中TreeView项时使用的数据模板时遇到一些问题。理想情况下,我希望每个项目包含 TextBlock ,然后选择时应包含 TextBox 相反。

    这是我到目前为止所拥有的(我曾经 this question 作为起点):

    <Window>
        <Window.Resources>
            <HierarchicalDataTemplate x:Key="normal"
                ItemsSource="{Binding Path=Children}">
                <TextBlock Text="{Binding Path=Text}" />
            </HierarchicalDataTemplate>
            <HierarchicalDataTemplate x:Key="selected"
                ItemsSource="{Binding Path=Children}">
                <TextBox Text="{Binding Path=Text}" />
            </HierarchicalDataTemplate>
            <Style TargetType="{x:Type TreeViewItem}" x:Key="ContainerStyle">
                <Setter Property="ItemTemplate" Value="{StaticResource normal}" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="ItemTemplate" Value="{StaticResource selected}" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Window.Resource>
        <Grid>
            <TreeView ItemSource="{Binding Body}" ItemContainerStyle="{StaticResource ContainerStyle}" />
        </Grid>
    </Window>
    

    结果是树中只有一个节点,节点的文本是对象的类型名。听起来绑定到节点的类型不是模板期望的类型,因此它使用的是默认值 ToString() 绑定而不是 Text 我指定的属性。

    我已经在代码隐藏文件中设置了窗口的DataContext。我知道我对数据的绑定是正确的,因为如果我设置了一个 HierarchicalDataTemplate 对于树视图,数据显示正确。

    我认为我的问题是我需要设置一个 ItemTemplate TreeViewItem 样式-我是使用正确的属性,还是应该设置其他属性?

    1 回复  |  直到 8 年前
        1
  •  2
  •   fubaar Gul Ershad    15 年前

    它实际上是您需要的headertemplate——这就是控制节点本身样式的原因。正因为如此,有了一个完整的样本,这才对我有效:

    <Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <HierarchicalDataTemplate x:Key="normal"
                                 ItemsSource="{Binding Path=Children}">
            <TextBlock Text="{Binding Path=Text}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate x:Key="selected"
                                 ItemsSource="{Binding Path=Children}">
            <TextBox Text="{Binding Path=Text}" />
        </HierarchicalDataTemplate>
        <Style TargetType="{x:Type TreeViewItem}"
               x:Key="ContainerStyle">
            <Setter Property="HeaderTemplate"
                    Value="{StaticResource normal}" />
            <Style.Triggers>
                <Trigger Property="IsSelected"
                         Value="True">
                    <Setter Property="HeaderTemplate"
                            Value="{StaticResource selected}" />
                </Trigger>
            </Style.Triggers>
        </Style>
        </Window.Resources>
        <Grid>
            <TreeView x:Name="_Tree" ItemContainerStyle="{StaticResource ContainerStyle}"/>
        </Grid>
    </Window>
    

    …下面是一些测试代码:

    Imports System.Collections.ObjectModel
    
    Class Window1
    
        Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    
            Dim Root As New Node
            Root.Text = "Root"
    
            Dim Child As New Node
            Child.Text = "Child"
            Root.Children.Add(Child)
    
            Dim Nodes As New Collection(Of Node)
            Nodes.Add(Root)
            _tree.itemssource = Nodes
    
        End Sub
    
    End Class
    
    Public Class Node
    
        Private _Text As String
        Public Property Text() As String
            Get
                Return _Text
            End Get
            Set(ByVal Value As String)
                _Text = Value
            End Set
        End Property
    
        Private _Children As New Collection(Of Node)
        Public Property Children() As Collection(of node)
            Get
                Return _Children
            End Get
            Set(ByVal Value As Collection(of node))
                _Children = Value
            End Set
        End Property
    
    End Class