将控件的可见性绑定到 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 控件的可见性绑定到从命令获得的项目的存在/不存在吗? [关闭]
将 ContextMenu 的 MenuItem 可见性绑定到 ListView 选择
如何将 WPF DataGrid DataColumns 可见性绑定到 UserControl 的 ViewModel 上的属性?