получить все выбранные элементы в виде дерева - PullRequest
0 голосов
/ 17 января 2020

Здравствуйте, у меня есть древовидная структура, чей элемент-шаблон является флажком. Я хочу получить выбранные элементы 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 + "");

                    }

                }
}

1 Ответ

0 голосов
/ 17 января 2020

Вы можете использовать метод stati c, который рекурсивно добавляет отмеченные элементы в коллекцию:

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

Затем вызывайте его с элементом root в качестве начала:

var checkedItems = new List<CheckTreeSource>();

AddCheckedItems(TreeRoot, checkedItems);

В качестве альтернативы объявите метод в классе CheckTreeSource:

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

Вы также можете взглянуть на это: { ссылка }

...