Скрытие узлов в TreeView - PullRequest
1 голос
/ 05 марта 2012

Допустим, у нас есть следующая коллекция:

ObservableCollection<Node> Nodes

Класс Node имеет следующую коллекцию:

ObservableCollection<Leaf> Leaves

, где класс Leaf имеет DependencyPropertyс именем IsActive.

Я хотел бы отобразить эти данные в TreeView, однако я хочу, чтобы только активные листья (объект Leaf, где IsActive равен True), отображались вих родитель Node.То есть я хочу, чтобы неактивные листья не отображались.Я также хотел бы, чтобы узлы без видимых листьев также были скрыты.В настоящее время у меня есть данные, отображаемые с использованием HierarchicalDataTemplate, но я не знаю, как скрыть описанные узлы.Я попытался изменить Content из HierarchicalDataTemplate, но стрелка свертывания (ItemContainer) все еще видна.

Есть ли способ достичь этого?или мне просто нужно изменить структуру данных?Дайте мне знать, если мне нужно добавить дополнительную информацию или уточнить что-либо.

Обновление: Я думаю, мне нужно уточнить, что я понимаю, что я могу просто изменить Node и Leaf надостичь того, что я ищу, но я хотел бы знать, должен ли я сделать это таким образом.Я хотел бы иметь возможность использовать шаблоны, стилизацию и т. Д. (Некоторые трюки xaml) для достижения желаемого представления.

1 Ответ

0 голосов
/ 05 марта 2012

Если вы можете, как насчет использования linq для фильтрации коллекции Nodes?Затем установите новую коллекцию в качестве источника данных вашего TreeView.Что-то вроде:

var ActiveNodes = Nodes.Where(p => p.Leaves.Any( l = l.IsActive == true));

Редактировать: Фильтрация во время связывания

Я все еще думаю, что первое решение - это путь, но если выможет посчитать это предложение тоже полезным.Измените класс Node на:

    class Node
    {
        public bool IsActiveNode 
        { 
            get 
            {
                return Leaves.Any(p => p.IsActive);
            }             
        }
        //Other stuff.. 
        public ObservableCollection<Leaf> Leaves { get; set; }        
    }

Затем вы можете использовать конвертер (см. Пример конвертеров здесь , если вы не знакомы), чтобы попытаться показать / скрытьузлы.

<toolkit:TreeView x:Name="MyTreeView" BorderThickness="0,0,0,0">
    <toolkit:TreeView.ItemTemplate>
        <toolkit:HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
            <StackPanel>
                <TextBox Visibility="{Binding IsActiveNode , Converter={StaticResource VisibilityConverter}}" ></TextBox>
            </StackPanel>
        </toolkit:HierarchicalDataTemplate>
    </toolkit:TreeView.ItemTemplate>
</toolkit:TreeView>

Если вы беспокоитесь о производительности первого подхода, я не думаю, что последний подход лучше :) Может быть, есть лучший способ, если так, то было бы приятно узнать.

РЕДАКТИРОВАТЬ 2 Чтобы ответить на ваш вопрос

Я хотел бы знать, должен ли я сделать это таким образом.

Я думаю, что вы должны изменить связанный источник во время выполнения (1) или ввести новое свойство для Node, например IsActive в Leaf (2)

...