Reputation: 36626
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
Upvotes: 55
Views: 20313
Reputation: 7463
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.
Upvotes: 24
Reputation: 204259
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>
Upvotes: 111