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

本文关键字:IEnumerable Count 控件 可见性 绑定 | 更新日期: 2023-09-27 18:09:59

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

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

但这不起作用。我尝试绑定MyList。对文本块中的文本进行计数以确保计数值正确,事实确实如此。它似乎没有正确设置能见度。

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

不能在绑定中使用逻辑表达式或代码表达式(它需要一个PropertyPath)。要么使用转换器,要么使用触发器,这就是我要做的:

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

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

有三种方法:

  1. 使用H.B.提到的触发器
  2. 通过在类中实现IValueConverter并将Binding的Converter属性设置为该类中IValueConverter的实例来使用转换器
  3. 在ViewModel中定义一个属性来直接返回可见性状态。

你总是可以使用触发器方法,它总是一个很好的方法。当您使用MVVM模式(并且您不限制自己在ViewModel中引用UI相关程序集)时,第三种方法是有用的(也是最好的)。我建议使用触发器,但如果你不想让你的xaml被那么多标记代码弄脏,请使用转换器。

您应该使用转换器,它将Count属性转换为可见性值,或者可能是一个新的"HasItems"布尔属性转换为可见性值。我们使用一些东西,例如,称为boolToVisibilityConvert,来处理这样的任务。

如果你需要的话,我可以给你更精确的细节。