WPF列表框空数据模板

55

我想知道人们如何处理没有任何项目的ListBox控件?例如,我想绑定一个搜索结果列表,但如果没有找到结果,我想显示“未找到结果”。

目前我的解决方法是,如果结果集数量= 0,则隐藏listbox并显示带有“未找到结果”消息的标签。理想情况下,我想要类似于ASP.NET数据网格EmptyTemplate解决方案的东西。

干杯

2个回答

110

我用了这段代码,取得了一些成功:

<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>

我看到了使用数据模板选择器的变体,但这个没有代码后台,太棒了! - levanovd
我刚刚将它复制粘贴到一个干净的新应用程序中,但它不起作用。我设置了listBox.ItemsSource = new List<string>(),但没有显示任何内容。 - Martin Konicek
2
好的,如果你想让它适用于每个ListBox,请删除x:Key="ListStyle"。否则,每个ListBox都必须指定它使用这个具体命名的样式。 - Martin Konicek
各位,这个有没有 Silverlight 的变体? - VoodooChild
它能够工作,但是对我来说却带来了一个问题。我的列表框可以接受拖放操作,但是当我设置了那个“模板”之后,它就不能再接受拖放操作了,只有当我将鼠标悬停在实际内容即“文本块”上时才能接受。我该如何解决这个问题? - JobaDiniz
1
@JobaDiniz请用新问题提出您的问题。 - ANeves

24

参考 @Matt Hamilton 的被采纳的答案,我创建了一个变体,不需要绑定,因为它使用 ListBoxHasItems 属性触发空模板:

<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时,我发现它很有用。

我不了解该方法是否有任何缺点,如果您发现任何问题,请欢迎评论。


它能够工作,但是对我来说却带来了一个问题。我的列表框可以接受拖放操作,但是当我设置了那个“模板”之后,它就不能再接受拖放操作了,只有当我将鼠标悬停在实际内容即“文本块”上时才能接受。我该如何解决这个问题? - JobaDiniz
可能拖放行为来自于 ListBoxItem 而不是 ListBox 本身。也许将 TextBlock 添加到控件模板中的 ListBoxItem 可以解决这个问题?我建议查看 WPF 参考源代码 并使用 Snoop 进行调试。 - g t
我正在使用WPF Inspector,并尝试将TextBlock添加到ListBoxItem中,但问题仍然存在...当我将内容水平和垂直对齐到中心(使文本显示在ListBox的中心)时 - JobaDiniz
好的...我建议您单独发布一个问题,这样您可以提供更多细节。 - g t
拖拽操作可能是因为控件模板上没有设置背景。(TextBlock默认为null)。为了解决这个问题,将TextBlock放在一个Border中,并将其背景设置为Transparent。这样就可以让它对鼠标再次可见。 - Mark A. Donohoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接