Показывать сообщение «Запись не найдена» в WPF DataGrid, когда она пуста - PullRequest
12 голосов
/ 14 января 2011

Если запись недоступна, я хочу добавить TextBlock в сетку данных под заголовком с сообщением «Запись не найдена».

Рассмотрите прилагаемое изображение для справки. alt text

Ответы [ 4 ]

15 голосов
/ 25 апреля 2014

Прошло много времени с тех пор, как вопрос был опубликован.Но я подумал, что это может пригодиться кому-то еще.

<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}" />

Для простоты я установил AutoGenerateColumns = "True".Пожалуйста, определите столбцы.Таким образом, когда привязан пустой источник данных, имена столбцов будут показаны вместе с сообщением «Пустая строка».

6 голосов
/ 16 января 2011

Наконец-то я смог найти способ.

  1. Когда сетка пуста, добавить сетку по умолчанию
  2. Создать шаблон RowDetailTemplate, содержащий текстовый блок с сообщением «Запись не найдена»

    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="No Record Found" Width="400"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
    
  3. Установить стиль в сетке данных

    <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>
    

По умолчанию (запись доступна на сетке данных) шаблон детализации строки будет свернут.

DataTrigger, который проверяет poprty CLR, если оно ложно, тогда показывает шаблон детализации строки.

Причина установки высоты строки в 0, чтобы скрыть строку по умолчанию, которую мы добавили на 1-м шаге.

5 голосов
/ 08 марта 2011

Я считаю, что легко отцентрировать текстовый блок над сеткой и установить его видимость на основе количества строк.Я обычно использую 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>
1 голос
/ 14 сентября 2018
  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>

Он будет отображаться / скрываться в зависимости от вашей коллекции / списка.

...