【发布时间】:2009-03-31 03:11:12
【问题描述】:
我想知道人们如何处理没有项目的 ListBox 控件?例如我想绑定一个搜索结果列表,但如果没有找到结果,我想显示“未找到结果”。
我目前解决这个问题的方法是,如果结果集计数 = 0,我会隐藏列表框,并显示带有“未找到结果”消息的标签。理想情况下,我想要 ASP .NET datagrid EmptyTemplate 解决方案。
干杯
【问题讨论】:
标签: .net wpf listbox datatemplate
我想知道人们如何处理没有项目的 ListBox 控件?例如我想绑定一个搜索结果列表,但如果没有找到结果,我想显示“未找到结果”。
我目前解决这个问题的方法是,如果结果集计数 = 0,我会隐藏列表框,并显示带有“未找到结果”消息的标签。理想情况下,我想要 ASP .NET datagrid EmptyTemplate 解决方案。
干杯
【问题讨论】:
标签: .net wpf listbox datatemplate
我在这段代码上取得了一些成功:
<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>
【讨论】:
基于@Matt Hamilton 接受的答案,作为参考,我创建了一个不需要绑定的变体,因为它使用ListBox 的HasItems 属性来触发空模板:
<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>
这允许样式在全局范围内使用,而不必知道列表绑定的属性名称。我发现它在绑定到 XAML 中定义的 CollectionViewSource 时很有用。
我不知道这种方法有什么缺点,如果你发现任何缺点,欢迎 cmets。
【讨论】:
Template 时,它不能再接受拖放,只有当我将鼠标悬停在实际内容上时,即TextBlock。我该如何解决这个问题?
ListBoxItems 而不是ListBox 本身。也许将TextBlock 添加到控件模板中的ListBoxItem 可能会解决这个问题?我建议您查看WPF reference sources 并与Snoop 一起工作。
TextBlock 默认为 null)。要解决这个问题,请将TextBlock 放入Border 并将其背景设置为Transparent。这将使它再次对鼠标可见。