Databinding grandchild objects in WPF

Databinding grandchild objects in WPF

Old forum URL: forums.lhotka.net/forums/t/8051.aspx


russelle posted on Friday, November 27, 2009

I'm having a problem with databinding a collection of child objects within a collection of child objects in WPF.

I have a business object Household, which contains a collection of HouseholdMember objects, each of which contains a collection of HouseholdMemberIdentity objects.

I am using the Entity Framework and have a CslaDataProvider defined in my edit form as:

<csla:CslaDataProvider x:Key="Household"
ObjectType="{x:Type Library:Household}"
FactoryMethod="GetHousehold"
IsAsynchronous="False"
DataChanged="DataChanged"
ManageObjectLifetime="True"
IsInitialLoadEnabled="False">
</csla:CslaDataProvider>

The Household data I'm editting is contained within a tab control whose data context is set by the following:

<TabControl Name="tabControlHousehold"
DataContext="{Binding Source={StaticResource Household}}" />

My HouseholdMembers are displayed in a DataGrid:

DataGrid Name="dataGridHouseholdMembers" ItemsSource="{Binding HouseholdMembers}"

A typical column in this DataGrid looks like this:

<DataGridComboBoxColumn
x:Name="dataGridComboBoxColumnRelationship"
ClipboardContentBinding="{Binding Path=RelationshipToPrimaryContact}"
Header="Relationship"
SelectedItemBinding="{Binding Path=RelationshipToPrimaryContact}"
SelectedValueBinding="{Binding Path=RelationshipToPrimaryContact}"
TextBinding="{Binding Path=RelationshipToPrimaryContact}" />

The HouseholdMemberIdentities are displayed in another DataGrid that is contained within the row details for the HouseholdMember that is selected:

<DataGrid.RowDetailsTemplate>
<DataTemplate x:Name="dataTemplatePersonDemographics">
<StackPanel Orientation="Vertical">
<GroupBox x:Name="groupBoxPersonDemographics" Visibility="Visible"></GroupBox>
<GroupBox x:Name="groupBoxHouseholdMemberIdentities">
DataGridName="dataGridHouseholdMemberIdentities"
ItemsSource="{Binding HouseholdMember/HouseholdMemberIdentities}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn A TYPICAL COLUMN
ClipboardContentBinding="{Binding Path=IdentityType}"
Header="Type"
SelectedItemBinding="{Binding Path=IdentityType}"
SelectedValueBinding="{Binding Path=IdentityType}"
TextBinding="{Binding Path=IdentityType}" />
</DataGrid.Columns>
</DataGrid>
</GroupBox>
</StackPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>

The HouseholdMembers are displaying fine; the HouseholdMemberIdentities are not displaying at all. I tried to set the DataContext for the GroupBox containing the HouseholdMemberIdentities DataGrid,

DataContext="{Binding Source=HouseholdMember}"

but this seems to have had no effect. So what is the proper syntax to set the ItemsSource for the DataGrid displaying the grandchild objects and its column Bindings?

To recap, Household conatins a collection of HouseholdMember objects called HouseholdMembers. Each HouseholdMember contains a collection of HouseholdMemberIdentity objects called HouseholdMemberIdentities.

russelle replied on Tuesday, December 01, 2009

I guess the real question (simplified) is: If I have an object hierarchy of

Household --> HouseholdMembers --> HouseholdMember --> HouseholdMemberIdentities --> HouseholdMemberIdentity

what is the proper Binding for a DataGrid containing the HouseholdMemberIdentities for a given HouseholdMember?

Curelom replied on Wednesday, December 02, 2009

try
ItemsSource="{Binding HouseholdMember.HouseholdMemberIdentities}"

use a period instead of a slash

Copyright (c) Marimer LLC