تغيير قالب TreeViewItem عند تحديده
-
21-08-2019 - |
سؤال
أواجه بعض المشكلات في تغيير 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