如何以编程方式 select TreeView 中使用 WPF 中数据绑定的值?

How do you programatically select values in TreeView that uses data binding in WPF?

我希望我的程序在将最近创建的对象添加到列表时自动select。这是当前不起作用的代码:

    public static void CreateResourceTree(TreeView selector,IEnumerable<Resource> resources,Resource onRefresh=null)
    {
        ActiveResources.Clear();
        ActiveResources.AddRange(resources.OrderByDescending(x=>x.FetchMeta("Priority").IntValue)
        .ThenBy(x=>x.Label)
        .ToList());
        selector.Items.Refresh();
        selector.SelectedItem=onRefresh;
    }

该代码旨在将值设置为 onRefresh 的值,不幸的是,SelectedItem 为 ReadOnly,这会导致错误。

当我用谷歌搜索这个问题时,我发现以编程方式 selecting 项目的唯一解决方案是在 TreeViewItem 上使用 "IsSelected" 属性,但由于这是数据 -绑定,它不使用或识别 TreeViewItem 对象。

这是 XAML 代码,以备不时之需:

    <TreeView ItemsSource="{Binding ResourceList}" Grid.Column="0" Grid.Row="3" x:Name="ResourcesTree" SelectedItemChanged="ResourcesTree_OnSelectedItemChanged" Margin="0,4,0,0">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type xmlclass:Resource}" ItemsSource="{Binding Children}">
                <ContentPresenter Content="{Binding Output}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

将您的资源包装在某种 ViewModel 中,或者只创建一个带有 IsSelected 属性 的子 class。

例如

public class SelectableResource : Resource
{
    public bool IsSelected { get; set; }
}

然后创建样式以将 TreeViewItem.IsSelected 绑定到新的 属性:

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

您现在可以从数据端设置所选项目,而不是尝试手动控制视图。

public static void CreateResourceTree(TreeView selector,IEnumerable<SelectableResource> resources,SelectableResource onRefresh=null)
{
    ActiveResources.Clear();
    ActiveResources.AddRange(resources.OrderByDescending(x=>x.FetchMeta("Priority").IntValue)
    .ThenBy(x=>x.Label)
    .ToList());

    onRefresh.IsSelected = true;
}