Xamly确定ListBox.Items.Count是否> 0

Shi*_*mmy 33 wpf xaml listbox

在XAML中是否有办法确定ListBox是否有数据?

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

Bry*_*son 48

ListBox包含您可以绑定的HasItems属性.所以你可以这样做:

<BooleanToVisibilityConverter x:Key="BooleanToVisibility" />
...
<ListBox 
    Visibility="{Binding HasItems, 
      RelativeSource={RelativeSource Self}, 
      Converter=BooleanToVisibility}" />
Run Code Online (Sandbox Code Playgroud)

或者作为触发器,因此您不需要转换器:

<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>
Run Code Online (Sandbox Code Playgroud)

我没有测试绑定,所以可能会有一些错别字,但你应该明白这个想法.

  • +1 - 这是一个很好的解决方案,比"零项"情况的触发更清晰.如果您想要其他行为或者您想要针对特定​​项目计数触发某些内容,则触发器非常有用. (2认同)
  • 是的,HasItems是一个DependencyProperty.您可以绑定它,一切都将在属性更改时更新.我不认为IEnumerable.Count会这样做. (2认同)

Mat*_*ton 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>
Run Code Online (Sandbox Code Playgroud)

因此默认显示ListBox,但如果Items.Count为0,则ListBox将被隐藏.

  • 看看Bryan Anderson的帖子,他建议使用列表框本身的HasItems属性,这比挖掘集合数更好.马特的触发方式比对流方式更好更短. (3认同)