WPF listbox empty datatemplate
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>
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.