0

我对 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 的其他部分之前无法选择它的父节点,然后一切都很好。

4

1 回答 1

0

在没有任何帮助的情况下,我没有尝试过任何工作,我转而使用 Telerik 控件。用 Telerik 的 RadTreeView 替换默认 TreeView 后,我的所有问题都消失了。如果可能,我建议人们避免使用 Microsoft 内置的 WPF TreeView 控件,因为它存在无数问题,并且您将花费大量时间来尝试处理它们,而不是开发您的应用程序。

于 2010-10-12T15:42:43.057 回答