当 WPF DataGrid 没有行时显示消息 'No data'

Showing message 'No data' when WPF DataGrid has no rows

我有一个 WPF DataGrid,当其中没有记录时,我想在其中显示一条消息 'No data'。所以我已经完成了 pchajer 提供的答案中解释的 here 但是当 datagrid 显示没有数据时,消息不会显示。我想我遇到了 AncestorType 的问题,我想我没有正确指定,但我不知道如何解决这个问题。我完全不明白 AncestorType 是如何工作的...

在我的代码下面:

<Window x:Class="My.Apps.WPF.Test.wMain"
        xmlns:local="clr-namespace:My.Apps.WPF.Test">

<dg:DataGrid.Style>
    <Style TargetType="dg:DataGrid">
        <Setter Property="RowDetailsVisibilityMode" Value="Collapsed"></Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding DataContext.IsRecordExists, 
                                   RelativeSource={RelativeSource Mode=FindAncestor,
                                                                  AncestorType={x:Type local:wMain}}}" Value="false">
                <Setter Property="RowHeight" Value="0"></Setter>
                <Setter Property="RowDetailsVisibilityMode" Value="Visible"></Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</dg:DataGrid.Style>

<!-- Missatge quan no hi ha documents pel procés seleccionat -->
<dg:DataGrid.RowDetailsTemplate>
    <DataTemplate>
        <StackPanel>
            <TextBlock Text="No hi ha documents disponibles pel procés seleccionat" Width="400"></TextBlock>
        </StackPanel>
    </DataTemplate>
</dg:DataGrid.RowDetailsTemplate>

</Window>

代码隐藏(XAML.cs):

namespace My.Apps.WPF.Test
{
    public partial class wMain : ViewBaseControl
    {

    }
}

您可以绑定到 DataGridHasItems 属性 并更改模板:

<DataGrid.Style>
    <Style TargetType="DataGrid">
        <Style.Triggers>
            <DataTrigger Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}" Value="false">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="DataGrid">
                            <TextBlock Text="No data..." />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.Style>

如果 DataGrid 中没有行,则永远不会显示任何行详细信息,因此该方法将不起作用。

编辑: 如果你想显示列 headers 即使没有行,你应该在模板中包含一个 DataGridColumnHeadersPresenter

<DataTrigger Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}" Value="false">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="DataGrid">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" Grid.Column="1" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                    <TextBlock Text="No data..." Grid.Row="1" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</DataTrigger>