选择 DataGridRow 时如何仅显示 RowDetails(而不是行)?

Posted

技术标签:

【中文标题】选择 DataGridRow 时如何仅显示 RowDetails(而不是行)?【英文标题】:How to show only RowDetails (not the row) when a DataGridRow is selected? 【发布时间】:2020-06-30 16:01:51 【问题描述】:

我收到了以下DataGrid

<DataGrid ItemsSource="Binding MyList" AutoGenerateColumns="False" SelectionUnit="FullRow">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Header" Binding="Binding MainText"/>
    </DataGrid.Columns>
    <DataGrid.RowDetailsTemplate>
        <DataTemplate DataType="x:Type local:MyViewModel">
            <TextBlock Text="Binding DetailText"/>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>

假设MyListMyViewModel 对象的集合:

public class MyViewModel 
    public string MainText  get; set; 
    public string DetailText  get; set; 

当用户单击行时,行的详细信息可见。是否有可能隐藏该行并仅显示选择的详细信息?

【问题讨论】:

"隐藏行,只显示选择的细节" -> 你的意思是用DataGrid.RowDetailsTemplate替换选定的行常规模板吗? 我认为是的。我只想查看选择的行详细信息。不是当前行本身与所有其他列。只是在“SecondTextInList”上绑定的 TextBlock 【参考方案1】:

您可以编辑每个DataGridRowControlTemplate 以在选中时隐藏其主要内容。

例如,您可以使用 MSDN 提供的 here 提供的 Style。这是一个很大的风格,所以我只会在这里粘贴重要的部分:

<Style TargetType="x:Type DataGridRow">
  <!-- ...some setters... -->
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="x:Type DataGridRow">
        <Border x:Name="DGR_Border"
                BorderBrush="TemplateBinding BorderBrush"
                BorderThickness="TemplateBinding BorderThickness"
                SnapsToDevicePixels="True">
          <Border.Background>
              <!-- ... -->
          </Border.Background>
          <VisualStateManager.VisualStateGroups>
            <!-- ...some states... -->
          </VisualStateManager.VisualStateGroups>
          <SelectiveScrollingGrid>
            <SelectiveScrollingGrid.ColumnDefinitions>
              <ColumnDefinition Width="Auto" />
              <ColumnDefinition Width="*" />
            </SelectiveScrollingGrid.ColumnDefinitions>
            <SelectiveScrollingGrid.RowDefinitions>
              <RowDefinition Height="*" />
              <RowDefinition Height="Auto" />
            </SelectiveScrollingGrid.RowDefinitions>
            <DataGridCellsPresenter Grid.Column="1"
                                    ItemsPanel="TemplateBinding ItemsPanel"
                                    SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" />
            <DataGridDetailsPresenter Grid.Column="1"
                                      Grid.Row="1"
                                      Visibility="TemplateBinding DetailsVisibility"
                                      SelectiveScrollingGrid.SelectiveScrollingOrientation="Binding AreRowDetailsFrozen, 
                                                    ConverterParameter=x:Static SelectiveScrollingOrientation.Vertical,
                                                    Converter=x:Static DataGrid.RowDetailsScrollingConverter, 
                                                    RelativeSource=RelativeSource AncestorType=x:Type DataGrid"/>
            <DataGridRowHeader Grid.RowSpan="2"
                               SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"
                               Visibility="Binding HeadersVisibility, 
                                            ConverterParameter=x:Static DataGridHeadersVisibility.Row, 
                                            Converter=x:Static DataGrid.HeadersVisibilityConverter, 
                                            RelativeSource=RelativeSource AncestorType=x:Type DataGrid" />
          </SelectiveScrollingGrid>
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

关键是当DataGridRow被选中时,将DataGridCellsPresenterVisibility改为Visibility.Collapsed。您可以通过在模板中添加以下 &lt;DataGridCellsPresenter.Style&gt; 标记来实现:

<DataGridCellsPresenter Grid.Column="1"
                        ItemsPanel="TemplateBinding ItemsPanel"
                        SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels">
    <DataGridCellsPresenter.Style>
        <Style TargetType="DataGridCellsPresenter">
            <Style.Triggers>
                <DataTrigger Binding="Binding IsSelected, RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=DataGridRow" Value="True">
                    <Setter Property="Visibility" Value="Collapsed" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGridCellsPresenter.Style>
</DataGridCellsPresenter>

如果您再次测试应用程序,这将折叠所选行上的主要内容,因此仅显示详细信息行。

【讨论】:

以上是关于选择 DataGridRow 时如何仅显示 RowDetails(而不是行)?的主要内容,如果未能解决你的问题,请参考以下文章

WPF datagrid 行变色

仅当右键单击鼠标悬停在特定的 datagridrow WPF C# 上时才显示 ContextMenu

如何使 DataGridView 显示选定的行?

如何实现 ImageButtons 的绑定,以便仅在加载图像后显示图像?

仅使用 shouldSelectItemAt indexPath 函数选择特定单元格

WPF 中DataGrid的应用