Если вы можете, как насчет использования 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)