将控件的可见性绑定到IEnumerable的“Count”

时间:2011-09-27 00:19:34

标签: c# wpf xaml data-binding

我有IEnumerable<>中包含的对象列表。 我想根据此列表的计数设置控件的可见性。我试过了:

 Visibility="{Binding MyList.Count>0?Collapsed:Visible, Mode=OneWay}"

但这不起作用。我尝试将MyList.Count绑定到文本块中的文本以确保计数值是正确的,并且确实如此。它似乎没有正确设置可见性。

3 个答案:

答案 0 :(得分:30)

您不能在绑定中使用逻辑或代码表达式(它需要PropertyPath)。使用converter或触发器,这就是我要做的事情:

<YourControl.Style>                     
    <Style TargetType="YourControl">
        <Setter Property="Visibility" Value="Collapsed" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding MyList.Count}" Value="0">
                <Setter Property="Visibility" Value="Visible" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</YourControl.Style>

(如果您愿意,您当然可以将样式重构为resource。)

答案 1 :(得分:3)

有三种方式:

  1. 使用H.B。
  2. 提到的触发器
  3. 通过在类中实现IValueConverter并将Binding的Converter属性设置为该类中的IValueConverter实例来使用转换器
  4. 在ViewModel中定义属性以直接返回Visibility状态。
  5. 你总是可以使用Triggers方法,它始终是一个很好的方法。当您使用MVVM模式时,第三种方法很有用(也是最好的)(并且您不会限制自己在ViewModel中引用与UI相关的程序集) 我建议使用触发器,但是如果你不想让你的xaml变脏那么多的标记代码使用转换器。

答案 2 :(得分:0)

您应该使用转换器,它将Count属性转换为Visibility值,或者将新的“HasItems”布尔属性转换为Visibility值。我们使用一些名为boolToVisibilityConvert的东西来处理这样的工作。

如果您需要,我可以为您提供更准确的详细信息。