【问题标题】:WPF listbox empty datatemplateWPF 列表框空数据模板
【发布时间】:2009-03-31 03:11:12
【问题描述】:

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

我目前解决这个问题的方法是,如果结果集计数 = 0,我会隐藏列表框,并显示带有“未找到结果”消息的标签。理想情况下,我想要 ASP .NET datagrid EmptyTemplate 解决方案。

干杯

【问题讨论】:

    标签: .net wpf listbox datatemplate


    【解决方案1】:

    我在这段代码上取得了一些成功:

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

    【讨论】:

    • 我看到了带有数据模板选择器的变体,但是这个没有代码隐藏,太棒了!
    • 我只是将它复制粘贴到清理新应用程序中,但它不起作用。我设置 listBox.ItemsSource = new List() 并没有显示任何内容。
    • 好的,如果您希望它适用于每个 ListBox,请删除 x:Key="ListStyle"。否则,每个 ListBox 都必须指定它使用这个具体的命名样式。
    • 嘿伙计们,这个有silverlight的变化吗?
    • @JobaDiniz 打开一个新问题。
    【解决方案2】:

    基于@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 时很有用。

    我不知道这种方法有什么缺点,如果你发现任何缺点,欢迎 cmets。

    【讨论】:

    • 它有效,但它给我带来了一个问题。我的列表框接受拖放(拖放),但是当我设置Template 时,它不能再接受拖放,只有当我将鼠标悬停在实际内容上时,即TextBlock。我该如何解决这个问题?
    • 拖放行为可能来自ListBoxItems 而不是ListBox 本身。也许将TextBlock 添加到控件模板中的ListBoxItem 可能会解决这个问题?我建议您查看WPF reference sources 并与Snoop 一起工作。
    • 我正在使用WPF Inspector,我尝试在 ListBoxItem 中添加 TextBlock,但问题仍然存在......当我将内容水平和垂直对齐到 center (所以文本显示在 ListBox 的中心)
    • 好的...我建议您单独发布一个问题,在那里您可以提供更多详细信息。
    • 拖放的事情可能是因为控件模板上没有设置背景。 (TextBlock 默认为 null)。要解决这个问题,请将TextBlock 放入Border 并将其背景设置为Transparent。这将使它再次对鼠标可见。
    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多