当它为空时,在WPF DataGrid上显示"找不到记录"消息

pch*_*jer 12 wpf xaml wpfdatagrid

如果没有可用的记录,我想TextBlock在标题下面添加一个数据网格,显示消息"找不到记录".

请考虑附图以供参考.替代文字

小智 15

自问题发布以来已经很久了.但我认为这可能对其他人有用.

<Window.Resources>
   <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>

<DataGrid Name="dgProjects" ItemsSource="{Binding Projects}" AutoGenerateColumns="True" />

<TextBlock Text="Employee has no projects" Visibility="{Binding Items.IsEmpty, Converter={StaticResource BooleanToVisibilityConverter}, ElementName=dgProjects}" />
Run Code Online (Sandbox Code Playgroud)

为简单起见,我设置了AutoGenerateColumns ="True".请定义列.这样,当绑定空数据源时,列名称将与"空行"消息一起显示.

  • 如果您不想保留标题,我认为这是最好的解决方案。 (2认同)

pch*_*jer 6

最后,我能够找到方法.

  1. 当网格为空时,在网格上添加默认行
  2. 创建一个RowDetailTemplate,其中包含一个带有"No Record Found"消息的文本块

    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="No Record Found" Width="400"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在datagrid上设置样式

    <DataGrid.Style>
        <Style TargetType="DataGrid">
            <Setter Property="RowDetailsVisibilityMode" Value="Collapsed"></Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding DataContext.IsRecordExists, 
                                        RelativeSource={RelativeSource Mode=FindAncestor,
                                        AncestorType={x:Type local:MainWindow}}}" Value="false">
                    <Setter Property="RowHeight" Value="0"></Setter>
                    <Setter Property="RowDetailsVisibilityMode" Value="Visible"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Style>
    
    Run Code Online (Sandbox Code Playgroud)

默认情况下(数据网格上可用的记录)行详细信息模板将折叠.

检查CLR属性的DataTrigger,如果为false,则显示行详细信息模板.

将rowheight设置为0的原因是为了隐藏我们在第1步添加的默认行.

  • 我也在寻找相同的功能,但在上面的代码AncestorType = {x:Type local:MainWindow}}},我收到错误"Type local:MainWindow not found",我需要放置什么祖先类型 (2认同)

小智 6

  1. 在堆栈面板内添加网格
  2. 将边框代码置于数据网格旁边
<Border HorizontalAlignment="Stretch" VerticalAlignment="Center" 
        BorderThickness="1,0,1,1" BorderBrush="Black" Height="35">
    <Border.Style> 
        <Style TargetType="Border">
            <Setter Property="Visibility" Value="Collapsed" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding YourListName.Count}" Value="0">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style> 
    </Border.Style> 
    <TextBlock Text="No record fount" HorizontalAlignment="Center"
               VerticalAlignment="Center" /> 
</Border>
Run Code Online (Sandbox Code Playgroud)

它将根据您的收藏/列表计数显示/隐藏。


Mik*_*ley 5

我发现很容易将文本块放在网格上,并根据行数设置其可见性.我通常使用MVVM并将可见性绑定到View Model属性:

<Grid>
    <toolkit:DataGrid>
        <toolkit:DataGrid.Columns>
           .
           .
           .
        </toolkit:DataGrid.Columns>
    </toolkit:DataGrid>
    <TextBlock Text="No Records Found" HorizontalAlignment="Center"  VerticalAlignment="Center" Visibility="{Binding EmptyMessageVisibility, Mode=OneWay, FallbackValue=Visible}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)