views:

421

answers:

1

Hi,

I've taken some sample code from http://sweux.com/blogs/smoura/index.php/wpf/2009/06/15/wpf-toolkit-datagrid-part-iv-templatecolumns-and-row-grouping/ that provides grouping of data in a WPF DataGrid. I'm modifying the example to use a DataTable instead of a Collection of entities.

My problem is in translating a binding declaration {Binding Parent.IsExpanded}, which works fine where Parent is a reference to an entity that has the IsExpanded attribute, to something that will work for my weakly typed DataTable, where Parent is the name of a column and references another DataRow in the same DataTable. I've tried declarations like {Binding Parent.Items[IsExpanded]} and {Binding Parent("IsExpanded")} but none of these seem to work.

How can I create a binding to the IsExpanded column of the DataRow Parent in my DataTable?

Thanks in advance, Dave

EDIT: I've created some sample code for a generic case of this problem:

Window1.xaml:

<Window x:Class="Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:WpfToolkit="http://schemas.microsoft.com/wpf/2008/toolkit" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
        <WpfToolkit:DataGrid 
            Name="dgSampleData" 
            ItemsSource="{Binding}" 
            AutoGenerateColumns="True" 
            Margin="0,75,0,0"> 
            <WpfToolkit:DataGrid.Columns> 
                <WpfToolkit:DataGridTextColumn 
                    Header="Bound Data" 
                    Binding="{Binding Col3.Item(0)}" 
                    /> 
            </WpfToolkit:DataGrid.Columns> 
        </WpfToolkit:DataGrid> 
    </Grid> 
</Window> 

Window1.xaml.vb:

Imports System.Data 

Class Window1 

    Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded 

        Dim dtSampleData As New DataTable 
        dtSampleData.Columns.Add("Col1") 
        dtSampleData.Columns.Add("Col2") 
        dtSampleData.Columns.Add("Col3") 
        dtSampleData.Rows.Add(dtSampleData.NewRow()) 
        dtSampleData.Rows.Add(dtSampleData.NewRow()) 
        dtSampleData.Rows(0).Item(0) = "r1c1" 
        dtSampleData.Rows(0).Item(1) = "r1c2" 
        dtSampleData.Rows(0).Item(2) = dtSampleData.Rows(0) 
        dtSampleData.Rows(1).Item(0) = "r2c1" 
        dtSampleData.Rows(1).Item(1) = "r2c2" 
        dtSampleData.Rows(1).Item(2) = dtSampleData.Rows(0) 
        dgSampleData.DataContext = dtSampleData 

    End Sub 

End Class

I've tried using the line Binding="{Binding Col3.Item(0)}" to show the value r1c1, but nothing appears in the cell contents. Why is that? Shouldn't Item(0) be just another property of Col3?

A: 

This binding expression will bind to a column named IsExpanded on a DataTable property named BindingDataTable on the object which is set as the views DataContext.

<CheckBox IsChecked="{Binding BindingDataTable.(Rows)[0][IsExpanded]}" 
          Content="Test"></CheckBox>

However I am specifying the first row ([0]) of the DataTable explicitly. I've not used the WPF DataGrid before so I'm not sure at this point how to get the current row index that is being bound...I'll see what I can work out and update if found.

Simon Fox
Thanks for this Simon. Each row has a column called Parent that is a reference to one of the other rows in the DataTable. Does that help?
Trindaz
@Trindaz What are you trying to bind the Parent.IsExpandable value to? Some type of `DataGridColumn` via the Binding property?
Simon Fox