【问题标题】:Programatically select first item in a UWP TreeView以编程方式选择 UWP TreeView 中的第一项
【发布时间】:2019-03-05 20:06:36
【问题描述】:

如何以编程方式在 UWP 树视图中选择 TreeViewItem?具体来说,我想选择我的树中的第一个项目。

我正在使用数据绑定。我知道我可以绑定 IsSelected 属性,但是,我绑定的对象没有这样的属性,并且希望避免编写包装器。

【问题讨论】:

    标签: uwp treeview


    【解决方案1】:

    如果你编辑 TreView 的样式,你会发现在它的 ControlTemplate 中,它实际上使用了一个TreeViewList 控件。

    <Style x:Key="TreeViewStyle1" TargetType="TreeView">
            <Setter Property="IsTabStop" Value="False"/>
            <Setter Property="CanDragItems" Value="True"/>
            <Setter Property="CanReorderItems" Value="True"/>
            <Setter Property="AllowDrop" Value="True"/>
            <Setter Property="ItemContainerTransitions">
                <Setter.Value>
                    <TransitionCollection>
                        <ContentThemeTransition/>
                        <ReorderThemeTransition/>
                        <EntranceThemeTransition IsStaggeringEnabled="False"/>
                    </TransitionCollection>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TreeView">
                        <TreeViewList x:Name="ListControl" AllowDrop="{TemplateBinding AllowDrop}" CanReorderItems="{TemplateBinding CanReorderItems}" CanDragItems="{TemplateBinding CanDragItems}" ItemContainerStyleSelector="{TemplateBinding ItemContainerStyleSelector}" ItemContainerStyle="{TemplateBinding ItemContainerStyle}" ItemTemplate="{TemplateBinding ItemTemplate}" ItemContainerTransitions="{TemplateBinding ItemContainerTransitions}" ItemTemplateSelector="{TemplateBinding ItemTemplateSelector}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

    TreeViewList 类继承自ListView。 ListView 具有 SelectedItem 属性。

    因此,您可以创建一个继承 TreeView 类的自定义 TreeView 控件。然后,您可以通过调用其GetTemplateChild() 方法找到TreeViewList 控件。之后,您可以为其设置 selectedItem。

    请查看我的代码示例:

    public class MyTreeView:TreeView
    {
        TreeViewList treeViewList;
        public MyTreeView()
        {
            this.Loaded += MyTreeView_Loaded;
        }
    
        private void MyTreeView_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            if (treeViewList != null)
            {
                treeViewList.SelectedIndex = 0;
            }
        }
    
        protected override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            treeViewList = this.GetTemplateChild("ListControl") as TreeViewList;
        }
    }
    

    但是通过这种方式,您只能为 RootNode 设置 selectedItem。如果要选择子节点,我还是觉得在IsSelected属性上绑定比较好。

    【讨论】:

    • 感谢 Xavier 的解释。看来 SelectedNode 即将推出。
    【解决方案2】:

    SelectedNodes 属性也可以是set。 这意味着,这应该有效:

    myTreeView.SelectedNodes = new List<TreeViewNode>{ myTreeView.RootNodes[0] };
    

    【讨论】:

    • 原则上这看起来不错,但是 SelectedNodes 是只读的,调用 .Add 不起作用
    • @Sam TreeView 控件不像常规列表视图控件具有 selectedItem 属性。它启用分层列表并包含嵌套项。它可能具有 N 级嵌套。目前,我认为绑定 IsSelected 属性在实践中是一个不错的选择。
    • @XavierXie-MSFT 我现在使用x:Bind local:Class.ShouldSelect(property) 解决了这个问题。 Github 上有关于 WinUI 的讨论,关于添加 SelectedNode 属性,现在应该最终解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多