dotnet/Documentation/compatibility/wpf-MasterDetail-ADOdata-Pr...

2.2 KiB

WPF Changing a primary key when displaying ADO data in a Master/Detail scenario

Scope

Minor

Version Introduced

4.7.2

Source Analyzer Status

NotPlanned

Change Description

Suppose you have an ADO collection of items of type Order, with a relation named "OrderDetails" relating it to a collection of items of type Detail via the primary key "OrderID". In your WPF app, you can bind a list control to the details for a given order:

<ListBox ItemsSource="{Binding Path=OrderDetails}" >

where the DataContext is an Order. WPF gets the value of the OrderDetails property - a collection D of all the Detail items whose OrderID matches the OrderID of the master item.

The behavior change arises when you change the primary key OrderID of the master item. ADO automatically changes the OrderID of each of the affected records in the Details collection (namely the ones copied into collection D). But what happens to D?

  • Old behavior: Collection D is cleared. The master item does not raise a change notification for property OrderDetails. The ListBox continues to use collection D, which is now empty.

  • New behavior: Collection D is unchanged. Each of its items raises a change notification for the OrderID property. The ListBox continues to use collection D, and displays the details with the new OrderID.

WPF implements the new behavior by creating collection D in a different way: by calling the ADO method xref:System.Data.DataRowView.CreateChildView(System.Data.DataRelation,System.Boolean)?displayProperty=nameWithType with the followParent argument set to true.

  • Quirked
  • Build-time break

An app gets the new behavior by using the following AppContext switch.

<configuration>
    <runtime>
        <AppContextSwitchOverrides value="Switch.System.Windows.Data.DoNotUseFollowParentWhenBindingToADODataRelation=false"/>
    </runtime>
</configuration>

The switch defaults to true (old behavior) for apps that target .NET 4.7.1 or below, and to false (new behavior) for apps that target .NET 4.7.2 or above.

Affected APIs

Not detectable via API analysis

Category

Windows Presentation Foundation (WPF)