Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF listbox empty datatemplate

I was wondering how people handle a ListBox control that has no items? e.g. I want to bind a list of search results but if no results are found i would like to display "No results found".

The way i currently tackle this is that i hide the listbox if the result set count = 0 and show a label with the "No results found" message. Ideally i would like something like the ASP .NET datagrid EmptyTemplate solution.

Cheers

like image 642
Alex Avatar asked Mar 31 '09 03:03

Alex


2 Answers

I've had some success with this code:

<Style TargetType="ListBox" x:Key="ListStyle" BasedOn="{StaticResource {x:Type ListBox}}">     <Style.Triggers>         <DataTrigger              Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Items.Count}"              Value="0"             >             <Setter Property="Template">                 <Setter.Value>                     <ControlTemplate>                         <TextBlock>No items to display</TextBlock>                     </ControlTemplate>                 </Setter.Value>             </Setter>         </DataTrigger>     </Style.Triggers> </Style> 
like image 162
Matt Hamilton Avatar answered Oct 02 '22 17:10

Matt Hamilton


Based on @Matt Hamilton's accepted answer, for reference, I created a variation which does not require the binding, as it uses the HasItems property of the ListBox to trigger the empty template:

<ListBox.Style>     <Style x:Key="EmptyListStyle"            TargetType="ListBox"            BasedOn="{StaticResource {x:Type ListBox}}">         <Style.Triggers>             <!-- Use ListBox.HasItems instead of Binding -->             <Trigger Property="HasItems" Value="False">                 <Setter Property="Template">                     <Setter.Value>                         <ControlTemplate>                             <TextBlock>No items to display</TextBlock>                         </ControlTemplate>                     </Setter.Value>                 </Setter>             </Trigger>         </Style.Triggers>     </Style> </ListBox.Style> 

This allows the style to be used globally, without having to know the property name to which the list binds. I found it useful when binding to a CollectionViewSource defined in XAML.

I'm not aware of any drawbacks of this method, comments welcome if you should find any.

like image 45
g t Avatar answered Oct 02 '22 17:10

g t