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

65 lines
2.2 KiB
Markdown

## 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:
```xml
<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`.
- [X] Quirked
- [ ] Build-time break
### Recommended Action
An app gets the new behavior by using the following AppContext switch.
```xml
<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)
<!--
457740
-->