用于条件计数的Xaml绑定

本文关键字:Xaml 绑定 条件 用于 | 更新日期: 2023-09-27 18:07:23

我正在为应用程序创建一个基本的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的总数

我该如何为第一个文本块设置上面的绑定?

用于条件计数的Xaml绑定

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

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>

您可以在这里找到有关转换器的更多信息。

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

作为一些补充信息,我个人认为这是对转换器的"欺骗"使用,因为您只实现了它的一半。一般来说,你的Convert方法的结果应该能够直接传递到你的ConvertBack方法中,并转换成它派生的源对象。这并不总是必要的;在本例中,我们将结果发送到一个仅显示的字段。但如果你要在网格或某种可编辑控件中拥有这个对象,你可能希望将它实现为双向的,以便用户可以更新转换后的值,并在后端发生适当的事情。