IValueConverter 以确定集合是否包含项目






4.75/5 (6投票s)
有时希望在视图中,当集合中没有项目或有项目时执行某些操作。使用转换器并绑定到集合的 Count 属性可以很容易地做到这一点。
引言
我遇到一个案例,在 Window
的侧面有一组通知,并且希望在没有通知时隐藏一个控件。我最初对如何做到这一点感到困惑,但幸运的是,ObservableCollection
具有 Count
属性。
Using the Code
我使用了一些我在创建灵活的 IValueConverter
时开发的类,描述这些类和代码示例的文章 在这里。这只是让它更容易了,我认为本文描述的转换器和辅助类是任何 WPF 项目的绝佳补充,并且我认为使用这些转换器可以使代码更易于阅读。 我还在我的转换器上继承自 MarkupExtension
,因为这意味着我可以在不首先在 XAML 中声明它们的情况下直接使用转换器。 这是我用来绑定要隐藏的控件的 Visibility
属性的 XAML,如果集合中存在元素
<TextBlock Grid.RowSpan="3" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" Text="No names added" Visibility="{Binding Names.Count, Converter={local:IsEqualConverter}, ConverterParameter=0?Visible:Collapsed}" />
如您所见,我使用的 Path
是 ObservableCollection
Names
的 Count
属性。您还可以看到,由于 IsEqualConverter
继承自 MarkupExtension
,我能够使用 {local:IsEqualConverter}
仅指定 Converter
。 ConverterParameter
指定条件,即“?
”标记之前的“0
”,如果 Count
的值等于该条件,则使用第一个值(Visible
),否则使用“:
”之后的值(Collapsed
)。
示例
该示例在 Window
的右侧有一个 ItemsCollection
和 TextBlock
,两者都填充整个右侧。 TextBlock
具有文本“No names added”(未添加名称),其 Visibility
绑定到绑定到 ItemsControl
的 ObservableCollection
的 Count
属性。 Converter
将 Count
转换为 Visiblity.Visible
(如果 Count
值为 0
),否则转换为 Visibility.Collapsed
。 在这种情况下,ConverterParameter
包含此属性绑定到特定转换所需的信息,以确定 IValueConverter
返回的内容以及在什么条件下返回每个内容。
要使用该示例,只需在 TextBox
中添加一个名称并单击“Add Name”(添加名称)Button
。 这会将名称添加到项目集合中,从而导致文本“No names added”(未添加名称)消失,并且名称出现在 ItemsControl
中。 可以单击“Delete Name”(删除名称)Button
以从集合中删除名称,并且文本“No names added”(未添加名称)将重新出现。
历史
- 2017/11/08:初始版本