2

我正在使用演示模型在我的应用程序中使用TreeView控件实现导航。我TreeViewItem通过双向绑定将 的 IsSelected 属性绑定到我的视图模型。选择具有子节点的节点时,我希望选择该节点的第一个子节点,而不是单击的那个节点。当它在我的演示模型上设置 IsSelected 属性时,似乎TreeViewItem没有监听属性更改事件。第一个子节点被选中,但父节点没有取消选择。这是我的演示模型中的代码。

public bool IsSelected {
    get {
        return this._isSelected;
    }
    set {
        if(this._isSelected != value) {
            this._isSelected = value;
            if(this.Nodes.Count > 0) {
                this._isSelected = false;
                this.Nodes[0].IsSelected = true;
            }
            this.NotifyPropertyChanged("IsSelected");
        }
    }
}

这是我的风格TreeViewItem

<Style TargetType="{x:Type TreeViewItem}">
    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
4

3 回答 3

2

我遇到了一个非常相似的问题,我发现当我通过代码选择一个孩子时,我还需要将焦点放在 TreeViewItem 包装器上,这样父节点就会成为你所谓的“UnSelect”。所以在 xaml 我添加了一个事件处理程序:

<EventSetter Event="TreeViewItem.Selected" 
                    Handler="TreeViewItem_Selected" 
                        />

在部分类中:

Private Sub TreeViewItem_Selected(ByVal sender As System.Object, ByVal e As RoutedEventArgs)
            If CType(sender, TreeViewItem) IsNot Nothing Then
                CType(sender, TreeViewItem).Focus()
                e.Handled = True
            End If
End Sub
于 2009-11-18T16:10:36.077 回答
1

另一种考虑的可能性:

TreeView 试图确保不可能同时选择树中的两个 TreeViewItem,因此它应该防止这种情况发生。也许这是 TreeView 中的一个错误,但也可能是您使用 TreeView 的方式的问题。

为了效率,TreeView 对如何找到它下面的 TreeViewItems 非常挑剔。该算法实际上是这样的(以增量方式完成):

  1. 在我的项目容器中查找 TreeView 对象
  2. 在这些 TreeView 对象的项目容器中查找更多 TreeView 对象
  3. 重复步骤 3,直到找不到更多 TreeView 对象

正因为如此,TreeView 只有在每一层 TreeViewItems 都在前一层的正下方时才能找到它的后代。

例如,这将起作用:

<TreeView>
  <TreeViewItem>
    <TreeViewItem />
  </TreeViewItem>
  ...
</TreeView>

这也是这样:

<HierarchicalDataTemplate TargetType="{x:Type MyItemType"} ItemsSource="{Binding subItems}">
  ...
</HierarchicalDataTemplate>

<TreeView ItemsSource="{Binding items}" />

但如果插入了非 TreeViewItems,它将不起作用,如下所示:

<TreeView>
  <TreeViewItem>
    <Border>
      <TreeViewItem/>
    </Border>
  </TreeViewItem>
</TreeView>

或这个:

<TreeView>
  <DockPanel>
    <TreeViewItem>
      <TreeViewItem/>
    </TreeViewItem>
  </DockPanel>
</TreeView>

最后两种情况会显示得很好,但 TreeView 不会看到 TreeViewItems,因此它的选择代码将被禁用。这会导致你描述的症状。

我不知道这是否是你的情况,但我想我应该提一下以防万一。

于 2009-11-19T06:00:56.033 回答
0

这是 Amir 答案的 C# 版本:

 private void TreeViewItem_Selected(object sender, RoutedEventArgs e)
        {
            var treeViewItem = sender as TreeViewItem;
            if (treeViewItem != null)
            {
                treeViewItem.Focus();
                e.Handled = true;
            }
        }
于 2018-05-30T13:33:00.020 回答