wpf treeview HierarchicalDataTemplate获取子控件

时间:2010-02-28 10:29:52

标签: wpf treeview

我正在使用这篇文章 http://blogs.msdn.com/delay/archive/2009/09/23/if-it-walks-like-a-duck-and-talks-like-a-duck-it-must-be-a-treegrid-a-simple-xaml-only-treegrid-ui-for-wpf.aspx

拥有分层数据...我正在使用包含网格的树视图,并且该网格包含文本框......

我只是想在树视图中的网格运行时隐藏/显示一些列...在任何级别..无论父母/孩子......

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是使用ViewModel概念。 ViewModel是一个数据结构,表示应用程序的UI视图,它是UI通常需要的模型(数据)+信息。

在您的示例中,您可以拥有一个包装数据的新类(可通过名为Model的属性访问),并具有其他属性,如布尔值IsVisible。 INotifyPropertyChanged必须由此类

实现

如果我复制并修改上述文章中显示的模板:

   <TreeView.ItemTemplate>

        <!-- Level 0 template leaves space for 2 child "Toggle" levels -->
        <HierarchicalDataTemplate ItemsSource="{Binding Model.SubItems}">
            <Grid Visibility={Binding IsVisible, Converter={StaticResource B2VConverter}}>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="Task"/>
                    <ColumnDefinition SharedSizeGroup="Toggle"/>
                    <ColumnDefinition SharedSizeGroup="Toggle"/>
                    <ColumnDefinition SharedSizeGroup="Duration"/>
                    <ColumnDefinition SharedSizeGroup="Notes"/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding Model.Task}" Style="{StaticResource TextBlockStyle}"/>
                <TextBlock Grid.Column="3" Text="{Binding Model.Duration}" Style="{StaticResource TextBlockStyle}"/>
                <TextBlock Grid.Column="4" Text="{Binding Model.Notes}" Style="{StaticResource TextBlockStyle}"/>
            </Grid>
        ... 

新的东西(我无法加粗我添加的文本)网格级别的IsVisible属性设置和数据属性引用“模型”。已被添加。它通过您必须在资源级别声明的转换器绑定到新的IsVisible属性:

  

现在,当您想隐藏或显示树中的项目时,可以修改ViewModel。就如此容易。 这是对MVVM编程方式的粗略介绍。你会找到很多关于它的文献。它具有很多优点,例如单元测试UI逻辑的能力(即在哪种情况下树元素变得可见?)。

更简单,模块化的方式来执行您的请求是将IsVisible属性直接添加到模型中,但这是不鼓励的,因为它混合了苹果和橙子。对于一个非常小的程序来说可能没问题,这个程序使用了几天然后就被扔掉了。