我对 WPF TreeView 有一个很大的问题。我已经设置了一棵与此类似的树。
<TreeView DataContext="{Binding Projects}">
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
</Style>
<TreeView.Resources>
<HierarchicalDataTemplate x:Key="LoadTemplate">
<Grid>
<TextBlock Text="{Binding Name}" />
</Grid>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="StepTemplate"
ItemsSource="{Binding Loads}"
ItemTemplate="{StaticResource LoadTemplate}">
<Grid>
<TextBlock Text="{Binding Name}" />
</Grid>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="ProjectTemplate"
ItemsSource="{Binding Steps}"
ItemTemplate="{StaticResource StepTemplate}">
<Grid>
<TextBlock Text="{Binding Name}" />
</Grid>
</HierarchicalDataTemplate>
</TreeView.Resources>
<TreeViewItem Header="Project Workspace"
ItemsSource="{Binding}"
IsExpanded="True"
ItemTemplate="{StaticResource ProjectTemplate}" />
</TreeView>
TreeView 绑定到名为 Projects 的 DependencyProperty,它是 xaml 的代码隐藏文件中的 ObservableCollection。树绑定到的类的基本结构遵循树的结构。因此 Project 包含一个自定义集合,该集合实现了 INotifyPropertyChanged 和 ICollectionChanged 接口。该集合可通过名为 Steps 的属性访问,并包含 Step 对象。Step 类还有一个可从名为 Loads 的属性访问的相同自定义集合的实例,并包含 Load 对象。
现在,当我使用项目中的任何对象时,树的行为正确,因为节点出现、消失并随着嵌套集合集的变化而正确变化。在大多数情况下,一切正常。
虽然我没有在上面的 Xaml 中展示它,但上面的每个节点都添加了自己特定的上下文菜单。该上下文菜单中的选项之一是添加对象。例如,如果您右键单击 Step 节点,您可以选择在其下方添加一个 Load 节点。将 Load 类添加到 Step 对象的 Loads 属性中确实会导致节点很好地显示在树中。
因此,例如,代码看起来类似于:
Projects[0].Steps[0].Loads.add(new Load());
好的,这是我一直在尝试解决的最长时间的问题。在该新节点出现在树中之后,它的父节点不再可选择。因此,在给定的示例中,您不能选择拥有新添加的 Load 节点的 Step 节点。您仍然可以执行 DoubleClick 和 RightClick 之类的操作并触发事件,但只是尝试用鼠标左键单击不会导致 Step 节点被选中或获得焦点。我已经尝试了我能想到的一切,但我终其一生都无法弄清楚为什么不这样做。
现在我可以点击树中的其他节点,它们可以选择就好了。并且在这样做之后,以前不允许被选择的节点然后恢复它以前的功能并再次能够被选择。
所以发生的事情是您添加了一个新节点,它会显示出来,并且在您选择 TreeView 的其他部分之前无法选择它的父节点,然后一切都很好。