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对象。
现在,当我处理Projects中的任何对象时,树的行为正确,节点出现并消失,并随着嵌套集合集的更改而正确更改。在大多数情况下,一切都按预期工作。
虽然我没有在上面的Xaml中显示它,但上面的每个节点都添加了自己的特定上下文菜单。该上下文菜单中的一个选项是添加对象。因此,例如,如果右键单击“步骤”节点,则可以选择在其下添加“加载”节点。将Load类添加到Step对象的Loads属性中会导致节点在树中显示正常。
因此,例如代码看起来与此类似:
Projects[0].Steps[0].Loads.add(new Load());
好的,这是我一直试图找出最长时间的问题。在新节点显示在树中之后,它的父节点不再可选。因此,在给定的示例中,您无法选择拥有新添加的Load节点的Step节点。您仍然可以执行DoubleClick和RightClick之类的操作并触发事件,但只需单击鼠标左键单击就不会导致选择步骤节点或具有焦点。我已经尝试了所有我能想到的东西,但我不能为我的生活找出原因。
现在我可以点击树中的其他节点,它们可以选择。在这样做之后,先前不允许被选中的节点然后重新获得它以前的功能并且再次能够被选中。
所以会发生的是你添加一个新节点,它会显示出来并且在你选择TreeView的其他部分然后一切都很好之后才能选择它的父节点。
答案 0 :(得分:0)
没有任何帮助,我尝试过没有任何工作,我转而使用Telerik控件。用Telerik的RadTreeView替换默认的TreeView后,我的所有问题都消失了。我建议如果可能的话,人们会避免使用微软内置的WPF TreeView控件,因为它会遇到无数问题,你会花费大量时间来处理它们,而不是开发你的应用程序。