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

时间:2016-04-02 20:05:15

标签: c# .net wpf xaml treeview

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

    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,这会导致错误。

当我用Google搜索问题时,我发现以编程方式选择项目的唯一解决方案是在TreeViewItem上使用“IsSelected”属性,但由于这是数据绑定的,因此它不使用或识别TreeViewItem对象。 / p>

以下是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>

1 个答案:

答案 0 :(得分:1)

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

e.g。

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;
}