用于条件计数的Xaml绑定

时间:2015-08-11 15:47:12

标签: c# xaml data-binding

我正在为一个应用程序创建一个基本的XX / YY控件,总计数很容易但是我在计算基于条件的XX时遇到了问题......

<StackPanel Orientation="Horizontal" Height="55"  Width="130" HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="00" FontSize="40" Margin="5,0,5,5" />
        <TextBlock Text="/" FontSize="40" Margin="5,0,5,5"/>
        <TextBlock Text="{Binding ItemList.Count, StringFormat={}{0:00}}" FontSize="40" Margin="5,0,5,5"/>
    </StackPanel>

第一个textBlock应该是ItemList的总计数,其中propertyX = 1

如何为第一个文本块设置上述绑定的任何想法。

1 个答案:

答案 0 :(得分:0)

您应该使用转换器来获取计数。

public class ConditionalCountConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var output = 0;

        var collection = value as IEnumerable<MyConnectable>();

        if(collection != null)
        {
            output = collection.Count(i => i.connectionStatus == 1);
        }

        return output;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

并在您的XAML中引用它,如下所示:

<UserControl xmlns:converters="clr-namespace:YourNamespaceNameGoesHere">
    <UserControl.Resources>
        <ResourceDictionary>
            <converters:ConditionalCountConverter x:Key="CountConverter" />
        </ResourceDictionary>
    </UserControl .Resources>
    <TextBlock Text="{Binding ItemList, Converter={StaticResource CountConverter}}" />
</UserControl>

您可以找到其他information about converters here

这样做会创建一个可由XAML访问的转换器对象的实例。然后,当此字段为渲染器并执行绑定时,它会将绑定对象传递给转换器Convert方法,并使用结果而不是绑定的对象。这非常强大!享受。

作为一些补充信息,我个人认为这是一个&#34; cheaty&#34;使用转换器,因为您只实现了一半转换器。通常,您的Convert方法的结果应该能够直接传递到您的ConvertBack方法并转换为源自它的源对象。这并不总是必要的;在这种情况下,我们将结果发送到仅显示字段。但是,如果您要将此对象放在网格或某种类型的可编辑控件中,您可能希望将其实现为双向,以便用户可以更新转换后的值,并在后端发生正确的操作。那只是我的两分钱。