在树视图中获取所有选定的项目

get all selected item in treeview

你好,我有一个 treeview,它的 itemtemplate 是复选框。我想获取选中的项目 ischecked = true 我该怎么做?

我想获取列表中所有选中的项目。有些项目可能有子项目

 <TreeView x:Name="chkTree" ItemsSource="{Binding TreeRoot}">
                        <TreeView.ItemTemplate>
                            <HierarchicalDataTemplate DataType = "{x:Type local:CheckTreeSource}" ItemsSource = "{Binding Children}">
                                <StackPanel Orientation="Horizontal">
                                    <CheckBox IsChecked="{Binding IsChecked}"/>
                                    <TextBlock Text="{Binding Text}"/>
                                </StackPanel>
                            </HierarchicalDataTemplate>
                        </TreeView.ItemTemplate>
                    </TreeView>

更新:

我试过了,但只有当一个项目被选中时才有效,但是如果只有子项目被选中(项目本身没有被选中,只有它的一些子项目)这段代码不起作用

foreach (var item in chkTree.Items)
            {
                if (((CheckTreeSource)item).IsChecked== true && ((CheckTreeSource)item).Children !=null)
                {
                    foreach (var subitem in ((CheckTreeSource)item).Children)
                    {
                        MessageBox.Show(((CheckTreeSource)subitem).Text + "");

                    }

                }
}

您可以使用静态方法递归地将选中的项目添加到集合中:

public static void AddCheckedItems(
    CheckTreeSource item, ICollection<CheckTreeSource> checkedItems)
{
    if (item.IsChecked)
    {
        checkedItems.Add(item);
    }

    if (item.Children != null)
    {
        foreach (var childItem in item.Children)
        {
            AddCheckedItems(childItem, checkedItems); // recursive call
        }
    }
}

然后以根项作为开始调用它:

var checkedItems = new List<CheckTreeSource>();

AddCheckedItems(TreeRoot, checkedItems);

或者在 CheckTreeSource 中声明方法 class:

public void AddCheckedItems(ICollection<CheckTreeSource> checkedItems)
{
    if (IsChecked)
    {
        checkedItems.Add(this);
    }

    if (Children != null)
    {
        foreach (var childItem in Children)
        {
            childItem.AddCheckedItems(checkedItems);
        }
    }
}

并这样称呼它:

var checkedItems = new List<CheckTreeSource>();

TreeRoot.AddCheckedItems(checkedItems);

您可能还想看看这个: