我有以下 DataGrid,其中有两列用于描述和状态。它们绑定到一个名为
ObservableCollection<RowViewModel>
的 RowViewModels
,它作为 DataGrid 上的 ItemsSource 传递。选择后,行详细信息将变得可见。对于此示例,详细信息中有两个文本框绑定到与 DataGrid 相同的属性。
当选择行且详细信息可见时,我在 RowDetails 上收到绑定错误。检查可视化树和绑定错误本身,它显示 RowDetails 的 DataContext 是
DataTemplate
,而不是 DataGrid 行的 DataContext。所选行的 DataContext 似乎没有向下传播到 RowDetails。 DataGrid控件如下,该控件的实现如下:
请注意,网格本身有一个虚拟机,它具有
RowViewModels
属性,如前所述
<DataGrid ItemsSource="{Binding RowViewModels}"
RowDetailsVisibilityMode="VisibleWhenSelected">
<DataGrid.Columns>
<DataGridTextColumn Header="Description" Binding="{Binding Description}"
Width="auto"
IsReadOnly="True"/>
<DataGridTextColumn Header="Status" Binding="{Binding Status}"
Width="auto"
IsReadOnly="True"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Border Width="auto"
BorderThickness="0 0 0 1"
DataContext="{Binding}">
<StackPanel Orientation="Vertical"
HorizontalAlignment="Left"
Height="auto"
Width="auto">
<TextBlock Text="{Binding Description}"/>
<TextBlock Text="{Binding Status}"/>
</StackPanel>
</Border>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
<controls:MyDataGrid
DataContext="{Binding DataGridViewModel}"
Grid.Row="2"
Height="auto"
Width="auto"
Margin="16 8 16 16"/>
行的 DataContext 如何向下传播到 RowDetails 以便绑定能够正常工作?
通过在 DataTemplate 中显式定义边框的 DataContext 来修复此问题:
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Border Width="auto"
BorderThickness="0 0 0 1"
DataContext="{Binding DataContext,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}}">
WPF 有时很糟糕...