我有一个WPF应用程序,它会创建一些TreeViewItems
并在启动期间将它们添加到我的TreeView
。我遇到的问题是,当加载窗口时,所有TreeViewItems
都有相同的标题文本。在应用程序打开时向TreeView
添加新项目时遇到了同样的问题,但在我将项目添加到UpdateLayout()
后添加TreeView
我能够解决该问题。 treeView.Items,Add(item)
。当我尝试在启动期间添加项目时执行相同的修复时问题未得到修复。是否存在UpdateLayout()
方法的问题,即不允许它更新每个项目以使它们具有不同的标题。
我的TreeView
使用的ItemTemplate
定义如下。
<TreeView.ItemTemplate>
<DataTemplate x:Name="datatemplate">
<StackPanel x:Name="stackpanel" Orientation="Horizontal" DataContext="{StaticResource ItemHeader}" >
<CheckBox x:Name="checkbox_treeview" IsChecked="{Binding Path=ischecked, Mode=OneWay}" Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}" Checked="treeView_AfterCheck" Unchecked="treeView_AfterCheck"/>
<Image x:Name="image_treeview" Width="16"/>
<local:WPFEditableTextBlock x:Name="label_TreeView" Text="{Binding Path=headertext}" Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}" LostFocus="treeView_AfterLabelEdit"/>
</StackPanel>
</DataTemplate>
</TreeView.ItemTemplate>
当我创建要添加到TreeViewItems
的新myTreeView
时,我创建了一个新的TreeViewItem
,并为其添加了Style
,其中包含Template
。
<Style x:Key="TreeViewItemStyle" TargetType="TreeViewItem"> <!--Selected Item Style -->
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel x:Name="stackpanel" Orientation="Horizontal" DataContext="{StaticResource ItemHeader}" >
<CheckBox x:Name="checkbox_treeview" IsChecked="{Binding Path=ischecked, Mode=OneWay}" Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}" Checked="treeView_AfterCheck" Unchecked="treeView_AfterCheck"/>
<Image x:Name="image_treeview" Source="node.png" Width="16" Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}" />
<local:WPFEditableTextBlock x:Name="label_TreeView" Text="{Binding Path=headertext}" Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}" LostFocus="treeView_AfterLabelEdit"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
<EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
<EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
<Style.Triggers>
<Trigger Property="local:TreeViewDropHighlighter.IsPossibleDropTarget" Value="True">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
</Trigger>
</Style.Triggers>
</Style>
此外我的Style
绑定到我的ItemHeader
类,这是我操纵标题文本的方式。
public class ItemHeader
{
/// <summary>
/// Gets or sets the header text of the TreeViewItem
/// </summary>
public string headertext { get; set; }
/// <summary>
/// gets or sets the checkbox for the TreeViewItem
/// </summary>
public bool ischecked { get; set; }
}
最后,当我调试时,我查看了将TreeViewItem
添加到TreeView
的代码,TreeView.Items
属性显示标题是不同的文本,但是当显示窗口时它们都有相同的标题文本。
我知道这是一个复杂而奇怪的问题,我可能没有解释得那么好,但我感到非常困难,任何建议都会有所帮助。