treeviewitem이 선택 될 때 템플릿 변경
-
21-08-2019 - |
문제
선택할 때 treeViewItem에 사용되는 데이터 템플릿을 변경하는 데 문제가 있습니다. 이상적으로는 각 항목이 TextBlock
, 그런 다음 선택되면 a TextBox
대신에.
지금까지 내가 가지고있는 것은 다음과 같습니다 (나는 사용했습니다. 이 질문 시작점) :
<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
내가 지정한대로 속성.
파일 뒤의 코드에서 창의 데이터 콘텍스트를 설정했습니다. 데이터에 대한 내 바인딩이 정확하다는 것을 알고 있습니다. HierarchicalDataTemplate
TreeView의 경우 데이터가 올바르게 표시됩니다.
내 문제는 내가 ItemTemplate
에서 TreeViewItem
스타일 - 올바른 속성을 사용하고 있습니까, 아니면 다른 것을 설정해야합니까?
해결책
실제로 필요한 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
제휴하지 않습니다 StackOverflow