WPF DataGrid - RowDetails DataContext

问题描述 投票:0回答:1

背景

我有以下 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 以便绑定能够正常工作?

wpf mvvm data-binding datagrid
1个回答
0
投票

通过在 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 有时很糟糕...

© www.soinside.com 2019 - 2024. All rights reserved.