首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF TreeView希望在选择父项时选择第一个子项

WPF TreeView希望在选择父项时选择第一个子项
EN

Stack Overflow用户
提问于 2009-05-07 12:06:29
回答 3查看 3.3K关注 0票数 2

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

代码语言:javascript
复制
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的风格

代码语言:javascript
复制
<Style TargetType="{x:Type TreeViewItem}">
    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
EN

回答 3

Stack Overflow用户

发布于 2009-11-19 00:10:36

我遇到了一个非常类似的问题,我发现当我通过代码选择子节点时,我还需要将焦点放在TreeViewItem包装器上,这样父节点就会出现您所说的"UnSelect“。因此,我在xaml中添加了一个事件处理程序:

代码语言:javascript
复制
<EventSetter Event="TreeViewItem.Selected" 
                    Handler="TreeViewItem_Selected" 
                        />

在分部类中:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2009-11-19 14:00:56

另一种需要考虑的可能性是:

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

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

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

因此,如果每个级别的TreeViewItems都直接位于前一个级别下,则TreeView只能找到它的后代。

例如,这是可行的:

代码语言:javascript
复制
<TreeView>
  <TreeViewItem>
    <TreeViewItem />
  </TreeViewItem>
  ...
</TreeView>

这个也是一样的:

代码语言:javascript
复制
<HierarchicalDataTemplate TargetType="{x:Type MyItemType"} ItemsSource="{Binding subItems}">
  ...
</HierarchicalDataTemplate>

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

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

代码语言:javascript
复制
<TreeView>
  <TreeViewItem>
    <Border>
      <TreeViewItem/>
    </Border>
  </TreeViewItem>
</TreeView>

或者这样:

代码语言:javascript
复制
<TreeView>
  <DockPanel>
    <TreeViewItem>
      <TreeViewItem/>
    </TreeViewItem>
  </DockPanel>
</TreeView>

最后两个案例可以很好地显示,但是TreeView看不到TreeViewItems,因此它的选择代码将被禁用。这将导致您所描述的症状。

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

票数 1
EN

Stack Overflow用户

发布于 2018-05-30 21:33:00

这是阿米尔答案的C#版本:

代码语言:javascript
复制
 private void TreeViewItem_Selected(object sender, RoutedEventArgs e)
        {
            var treeViewItem = sender as TreeViewItem;
            if (treeViewItem != null)
            {
                treeViewItem.Focus();
                e.Handled = true;
            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/834267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档