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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top