nicolas
nicolas

Reputation: 9805

Treeview with Grid inside in WPF

I want to display a simple schema of a database in a treeview with 1 level of depth. So I have a collection of tables, whose name I'd like to display as a header of the elements, and for each table a collection of columns with name, type, etc..

However in each table I want to display those columns definition in a grid, with a header specifying the properties of the columns definition, and in each row, the definition itself.

One way to make this work is to see that as a treeview where each table has a sequence of one child (the entire collection of column definition), then displayed as a grid :

<TreeView  ItemsSource="{Binding Tables}" x:Name="treeView"  MinWidth="400" >
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=ListofONEelement}">
        <TextBlock Text="{Binding Path=TableName}" />
        <HierarchicalDataTemplate.ItemTemplate>
            <DataTemplate>
            <ListView ItemsSource="{Binding GroupOfColumnDefinition}">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="ColumnName"   DisplayMemberBinding="{Binding Path=Item1}" />
                        <GridViewColumn Header="Model"        DisplayMemberBinding="{Binding Path=Item2.Model}" />
                        <GridViewColumn Header="ColumnStatus" DisplayMemberBinding="{Binding Path=Item2.ColumnStatus}" />
                        <GridViewColumn Header="ColumnType"   DisplayMemberBinding="{Binding Path=Item2.ColumnType}" />
                    </GridView>
                </ListView.View>
            </ListView>
            </DataTemplate>
        </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

But I had to create this intermediate structure ListofONEelement to make this works, as hierarchy in the treeview exists only if there are items to enumerate.

Are there other, nicer ways to do this, directly in XAML, that would not require to have a custom type created in my ViewModel ?

Upvotes: 1

Views: 5239

Answers (1)

Lee Louviere
Lee Louviere

Reputation: 5262

Actually put the one item in the TreeView. Don't use HierarchicalDataTemplate.

<TreeView ItemsSource="{Binding Tables}">
    <TreeView.ItemTemplate>
        <DataTemplate>
            <TreeViewItem Header="{Binding TableName}">
                <ListView ItemsSource="{Binding GroupOfColumnDefinition}">
                    <ListView.View>
                        <GridView>
                            <GridViewColumn Header="ColumnName"   DisplayMemberBinding="{Binding Path=Item1}" />
                            <GridViewColumn Header="Model"        DisplayMemberBinding="{Binding Path=Item2.Model}" />
                            <GridViewColumn Header="ColumnStatus" DisplayMemberBinding="{Binding Path=Item2.ColumnStatus}" />
                            <GridViewColumn Header="ColumnType"   DisplayMemberBinding="{Binding Path=Item2.ColumnType}" />
                        </GridView>
                    </ListView.View>
                </ListView>
            </TreeViewItem>
        </DataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Upvotes: 3

Related Questions