假设我们有以下集合:
ObservableCollection<Node> Nodes
Node
类具有以下集合:
ObservableCollection<Leaf> Leaves
其中Leaf
类的DependencyProperty
名为IsActive
。
我想在TreeView
中显示这些数据,但是,我只想要显示活动的叶子(Leaf
IsActive
True
的{{1}}对象)他们的父母Node
。也就是说,我希望不显示不活动的叶子。我也希望隐藏没有可见叶子的节点。我目前使用HierarchicalDataTemplate
显示数据,但我不知道如何隐藏所描述的节点。我尝试更改Content
的{{1}},但折叠箭头(HierarchicalDataTemplate
)仍然可见。
有没有办法实现这个目标?或者我只需要更改数据结构? 如果我需要添加更多信息或澄清某些内容,请与我们联系。
更新
我想我需要澄清一点,我明白我可以改变ItemContainer
和Node
来实现我想要的目标,但我想知道我是否必须这样做。我希望能够使用模板,样式等(一些xaml技巧)来实现我想要的视图。
答案 0 :(得分:0)
如果可以,使用 linq 过滤Nodes
集合怎么样?然后将新集合设置为`TreeView的数据源。 Smth喜欢:
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; }
}
然后,您可以使用转换器(请参阅转换器here的示例,以防您不熟悉)尝试显示/隐藏节点。</ p>
<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
(2)<中向<{1}}引入新属性,如 IsActive / p>