65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (6投票s)

2017年8月11日

CPOL

2分钟阅读

viewsIcon

13032

downloadIcon

189

有时希望在视图中,当集合中没有项目或有项目时执行某些操作。使用转换器并绑定到集合的 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}" />

如您所见,我使用的 PathObservableCollection NamesCount 属性。您还可以看到,由于 IsEqualConverter 继承自 MarkupExtension,我能够使用 {local:IsEqualConverter} 仅指定 ConverterConverterParameter 指定条件,即“?”标记之前的“0”,如果 Count 的值等于该条件,则使用第一个值(Visible),否则使用“:”之后的值(Collapsed)。

示例

该示例在 Window 的右侧有一个 ItemsCollectionTextBlock,两者都填充整个右侧。 TextBlock 具有文本“No names added”(未添加名称),其 Visibility 绑定到绑定到 ItemsControlObservableCollectionCount 属性。 ConverterCount 转换为 Visiblity.Visible(如果 Count 值为 0),否则转换为 Visibility.Collapsed。 在这种情况下,ConverterParameter 包含此属性绑定到特定转换所需的信息,以确定 IValueConverter 返回的内容以及在什么条件下返回每个内容。

Collection Empty Image

Collection with Values Image

要使用该示例,只需在 TextBox 中添加一个名称并单击“Add Name”(添加名称)Button。 这会将名称添加到项目集合中,从而导致文本“No names added”(未添加名称)消失,并且名称出现在 ItemsControl 中。 可以单击“Delete Name”(删除名称)Button 以从集合中删除名称,并且文本“No names added”(未添加名称)将重新出现。

历史

  • 2017/11/08:初始版本
© . All rights reserved.