隐藏TreeView中的节点

时间:2012-03-05 14:22:32

标签: silverlight treeview silverlight-5.0

假设我们有以下集合:

ObservableCollection<Node> Nodes

Node类具有以下集合:

ObservableCollection<Leaf> Leaves

其中Leaf类的DependencyProperty名为IsActive

我想在TreeView中显示这些数据,但是,我只想要显示活动的叶子(Leaf IsActive True的{​​{1}}对象)他们的父母Node。也就是说,我希望不显示不活动的叶子。我也希望隐藏没有可见叶子的节点。我目前使用HierarchicalDataTemplate显示数据,但我不知道如何隐藏所描述的节点。我尝试更改Content的{​​{1}},但折叠箭头(HierarchicalDataTemplate)仍然可见。

有没有办法实现这个目标?或者我只需要更改数据结构? 如果我需要添加更多信息或澄清某些内容,请与我们联系。

更新 我想我需要澄清一点,我明白我可以改变ItemContainerNode来实现我想要的目标,但我想知道我是否必须这样做。我希望能够使用模板,样式等(一些xaml技巧)来实现我想要的视图。

1 个答案:

答案 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>