En muchas ocasiones utilizamos un DataGrid para realizar búsquedas. En estos casos, nos puede interesar informar al usuario de que no se han encontrado registros tras una búsqueda, de una forma más explícita que por el mero hecho de que no contenga elementos. Para ello, el DataGrid puede mostrar un texto con el mensaje que se considere apropiado. Para conseguir esto con el DataGrid de WPF (WPF Toolkit), podemos modificar el estilo del control añadiendo un objeto TextBlock, cuya visibilidad dependerá de que el DataGrid contenta o no elementos. En el código XAML que se muestra a continuación, vemos resaltado en negrita las modificaciones necesarias para hacer esto:
XAML:
<ControlTemplate TargetType="{x:Type Controls:DataGrid}">
<Border >
<Grid>
<TextBlock Name="PART_EmptyText" FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed"/>
<ScrollViewer Focusable="false" >
<ScrollViewer.Template>
…
</ScrollViewer.Template>
<ItemsPresenter Name="itemsPresenter" />
</ScrollViewer>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="HasItems" Value="False">
<Setter TargetName="PART_EmptyText" Property="Visibility" Value="Visible"/>
<Setter TargetName="itemsPresenter" Property="Visibility" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Una vez que tenemos el TextBlock, nos faltaría poder asignarle un texto a mostrar cuando no haya elementos. Podemos hacerlo con una AttachedProperty, que en este caso hemos llamado EmptyText:
C#:
public static readonly DependencyProperty EmptyTextProperty = DependencyProperty.RegisterAttached("EmptyText", typeof(string), typeof(DataGridBehavior), new PropertyMetadata(OnEmptyTextChanged));
private static void OnEmptyTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DataGrid dataGrid = (d as DataGrid);
if (dataGrid != null) dataGrid.Loaded += dataGrid_Loaded;
}
private static void dataGrid_Loaded(object sender, RoutedEventArgs e)
{
DataGrid dataGrid = (sender as DataGrid);
if (dataGrid != null)
{
dataGrid.ApplyTemplate();
if (!string.IsNullOrEmpty(GetEmptyText(dataGrid)))
{
//Accedemos al elemento PART_EmptyText de la plantilla aplicada al DataGrid, y asignamos su propiedad Text
TextBlock texto = dataGrid.GetChild("PART_EmptyText", true) as TextBlock;
if (texto != null) texto.Text = GetEmptyText(dataGrid);
}
}
}
La forma de utilizarlo en un DataGrid sería la siguiente:
XAML:
<Controls:DataGrid Behaviors:DataGridBehavior.EmptyText="No se han encontrado elementos" … />