Ändern der Vorlage eines TreeViewItem, wenn es ausgewählt ist,
-
21-08-2019 - |
Frage
Ich habe einige Probleme, die die Datatemplate zu ändern, die für eine TreeViewItem verwendet wird, wenn es ausgewählt ist. Idealerweise würde ich jedes Element wie ein TextBlock
enthalten, und dann gewählt, wenn es stattdessen eine TextBox
enthalten sollte.
Hier ist, was ich bisher (ich habe als Ausgangspunkt):
<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>
Was passiert, ist, dass es nur ein Knoten im Baum ist, und der Text des Knotens ist der Typname des Objekts. Es klingt wie die Art an den Knoten gebunden ist nicht das, was die Vorlage erwartet, so dass es mit dem Standard-ToString()
anstelle der Text
Eigenschaft Bindung, wie ich angegeben.
Ich habe die Datacontext des Fensters in der Code-behind-Datei festgelegt. Ich weiß, dass meine Bindings für die Daten richtig sind, denn wenn ich ein HierarchicalDataTemplate
für das TreeView stellen Sie die Daten korrekt angezeigt wird.
Ich denke, dass mein Problem ist, dass ich eine Eigenschaft, die nicht ItemTemplate
in den TreeViewItem
Stile festlegen müssen - bin ich das richtige Objekt, oder sollte ich etwas anderes
Lösung
Es ist eigentlich die Header Sie brauchen - das ist, was den Stil des Knotens selbst regelt. Nur so gibt es eine komplette Probe vorhanden ist, das ist, was für mich gearbeitet:
<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>
.. mit einigen Testcode hinter wie folgt aus:
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