Xamly如何确定ListBox中的项数是否大于0?

35

在XAML中,有没有一种方法可以确定ListBox是否具有数据?

如果没有数据,我想将其IsVisible属性设置为false。


33
+1 针对创造“xamly”这个术语。 - anthony
你有更好的术语吗? - Shimmy Weitzhandler
4个回答

51

ListBox包含一个HasItems属性,您可以将其绑定到。因此,您只需要执行以下操作:

<BooleanToVisibilityConverter x:Key="BooleanToVisibility" />
...
<ListBox 
    Visibility="{Binding HasItems, 
      RelativeSource={RelativeSource Self}, 
      Converter=BooleanToVisibility}" />

或者将其作为触发器,这样你就不需要转换器:

<ListBox>
  <ListBox.Style>
    <Style TargetType="{x:Type ListBox}">
      <Setter Property="Visibility" Value="Visible" />
      <Style.Triggers>
        <DataTrigger 
            Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}"
            Value="False">
          <Setter Property="Visibility" Value="Hidden" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ListBox.Style>
</ListBox>

我尚未测试绑定,因此可能会有一些错字,但您应该能够理解主要思想。


2
+1 - 这是一个不错的解决方案,比针对“零项”情况的触发器更加简洁。如果您想要其他行为或者想要针对特定数量的项目触发某些操作,那么触发器是有用的。 - Matt Hamilton
你知道我在想什么吗?我认为HasItems甚至是一个DependencyProperty! - Shimmy Weitzhandler
2
是的,HasItems是一个DependencyProperty。您可以绑定它,当属性更改时,所有内容都会更新。我不认为IEnumerable.Count会做到这一点。 - Bryan Anderson
不知道为什么,但 HasItems 对我没有起作用:items.count 大于零,但 HasItems 仍然为 false。 - Zéiksz
@Zéiksz 你是否绑定到实现了INotifyCollectionChanged接口的集合?如果没有,那么控件就不知道集合中的项目是何时被添加/移除的。 - Bryan Anderson
显示剩余2条评论

14

在触发器中完成此操作,您将不需要使用ValueConverter:

<ListBox>
  <ListBox.Style>
    <Style TargetType="{x:Type ListBox}">
      <Style.Triggers>
        <DataTrigger 
          Binding="Items.Count, {Binding RelativeSource={RelativeSource Self}}"
          Value="0">
          <Setter Property="Visibility" Value="Hidden" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ListBox.Style>
</ListBox>

这会使ListBox默认显示,但如果Items.Count为0,则隐藏ListBox。


4
看看Bryan Anderson的帖子,他建议使用listbox本身的HasItems属性,这比深入集合计数更好。 尽管转换器存在,但Matt的触发方式更好也更短。 - Shimmy Weitzhandler

2
<ListBox.Style>
    <Style TargetType="ListBox">
        <Setter Property="Visibility" Value="Visible"/>
        <Style.Triggers>
            <Trigger Property="HasItems" Value="False">
                <Setter Property="Visibility" Value="Hidden"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</ListBox.Style>

1

你可以使用ValueConverter和普通绑定来使其工作。

将可见性设置为:

Visibility = "{Binding myListbox.Items.Count, Converter={StaticResource VisibilityConverter}}"

然后设置您的转换器,根据计数的值返回Visibility.Collapsed等。


1
ItemCollection.Count 不是一个依赖属性,当集合中的项目数量发生变化时,绑定不会得到更新。 - Martin Liversage
<ListBox Visibility="{Binding Items.Count, RelativeSource={RelativeSource Self}, Converter={StaticResource EmptyListVisibilityConverter}}"/> - Shimmy Weitzhandler
Martin,你看起来是对的,但是上面的代码对我来说是有效的。 可能是集合变化事件也刷新了可见性属性。 - Shimmy Weitzhandler
我希望有一个纯粹的“xamly”项目,但我认为没有其他方法,除非使用转换器。 我认为WPF应该内置条件转换器,如布尔术语、布尔开关;或者和> < =等运算符等。 - Shimmy Weitzhandler
@Martin,请看一下Bryan Anderson的回复。 - Shimmy Weitzhandler

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