سؤال

أواجه بعض المشكلات في تغيير DataTemplate المستخدم لـ TreeViewItem عند تحديده.من الناحية المثالية، أود أن يحتوي كل عنصر على أ TextBlock, ، ثم عند تحديده يجب أن يحتوي على ملف 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 الملكية كما حددتها.

لقد قمت بتعيين DataContext للنافذة في الكود الموجود خلف الملف.أعلم أن ارتباطاتي بالبيانات صحيحة، لأنه إذا قمت بتعيين واحدة 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top