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

17

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

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

但这不起作用。我试图将MyList.Count绑定到文本块中的文本,以确保计数值正确,它确实是正确的。它只是似乎不能正确设置可见性。


看起来你可能需要这个:http://www.11011.net/wpf-binding-expressions - Gabe
3个回答

44

你不能在绑定中使用逻辑或代码表达式(它期望一个 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
谢谢,这很棒。你知道如何将其重构为资源元素,以便可以将不同的列表作为参数传递吗? - BenKoshy
@BKSpurgeon:如果数据上下文中的属性不同,那么这个问题很难解决,因为绑定通常是静态的。如果您有选项,可以创建一些约定,以便路径与各种数据上下文一起工作,就像一个接口一样,数据上下文实现了该接口,提供一个始终具有相同名称的列表属性。 - H.B.
@BKSpurgeon:有一种选项可以使用标记扩展来更或少动态地构建绑定路径,但它们可能在样式创建时执行,而不是应用程序,因此这也可能没有任何作用。 - H.B.
我有一个类似的问题,使用类似于H.B.的代码。 无论如何,它只在第一次加载控件时起作用。但是,如果删除或添加Listbox元素,则不起作用。 还有其他可能出错的地方吗? - Emanuele Benedetti
@EmanueleBenedetti:你的列表是否会触发更改通知?Count必须是一个依赖属性(通常仅用于UI元素),或者列表类必须实现INotifyPropertyChanged。如果你使用ObservableCollection,那应该可以工作。 - H.B.
@H.B. 我正在使用经典的 List<>。我将尝试使用 ObservableCollection - Emanuele Benedetti

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

0

你应该使用一个转换器,将Count属性转化为Visibility值,或者可以创建一个新的“HasItems”布尔属性来转换成Visibility值。我们通常使用一个叫做boolToVisibilityConvert的东西来处理这种工作。

如果需要更精确的细节信息,我可以给你提供。


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