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

Posted

技术标签:

【中文标题】将控件的可见性绑定到 IEnumerable 的“计数”【英文标题】:Binding visibility of a control to 'Count' of an IEnumerable 【发布时间】:2011-11-25 15:30:04 【问题描述】:

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

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

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

【问题讨论】:

看起来你可以使用这个:11011.net/wpf-binding-expressions 【参考方案1】:

您不能在绑定中使用逻辑或代码表达式(它需要 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。)

【讨论】:

谢谢,这太好了 - 您知道如何将其重构为资源元素,以便您可以将不同的列表作为参数传递吗? @BKSpureon:好吧,如果数据上下文的属性不同,这很难做到,不幸的是绑定是相当静态的。如果您可以选择创建一些约定,以便路径与各种数据上下文一起使用,可以说是数据上下文实现的接口,提供始终具有相同名称的列表属性。 @BKSpureon:可以选择使用标记扩展或多或少动态地构建绑定路径,但它们可能在样式创建时执行,而不是在应用程序中执行,因此也可能无处可去。 我遇到了类似的问题,使用的代码与 H.B. 的代码相似。无论如何,它仅在第一次加载控件时才起作用。但如果列表框元素被删除或添加,则不会。还有其他可能出错的地方吗? @EmanueleBenedetti:您的列表会触发更改通知吗? Count 必须是依赖属性(通常仅用于 UI 元素)或者列表类必须实现 INotifyPropertyChanged。如果您使用 ObservableCollection 应该可以工作。【参考方案2】:

有三种方式:

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

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

【讨论】:

【参考方案3】:

您应该使用转换器,将 Count 属性转换为 Visibility 值,或者将新的“HasItems”布尔属性转换为 Visibility 值。例如,我们使用名为 boolToVisibilityConvert 的东西来处理此类作业。

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

【讨论】:

以上是关于将控件的可见性绑定到 IEnumerable 的“计数”的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 WPF ComboBox 控件的可见性绑定到从命令获得的项目的存在/不存在吗? [关闭]

WPF - 将 UserControl 可见性绑定到属性

WPF 触发器绑定:将枚举值绑定到可见性的最佳方法是啥?

将 ContextMenu 的 MenuItem 可见性绑定到 ListView 选择

WPF - 可以将标签的属性(可见性)绑定到标签的目标吗?

如何将 WPF DataGrid DataColumns 可见性绑定到 UserControl 的 ViewModel 上的属性?