显示"已填充的数量"组头WPF中的行

时间:2017-02-13 03:59:09

标签: c# wpf xaml mvvm converter

我的ViewModel observablecollection中有一定数量的行正在分组并显示在数据网格中。

<CollectionViewSource x:Key="ColViewSource" Source="{Binding Collection}">
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="Cat"/>
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

我的行包含一个textfield和一个threestate复选框,需要为true或不确定状态才能考虑行#​​34; fill&#34; (默认为false)。我想显示&#34;填充&#34;我的groupheader中的行在组中的总项目中。例如,如果我有一个包含5个项目的组,并且用户勾选了2个复选框,我希望看到5个中的2个或组头中的2/5。我可以设法获得名称和itemcount没有问题显示在groupheader但我坚持显示填充行的数量。以下是我希望群组标题的显示方式。

<Expander.Header>
    <StackPanel Orientation="Horizontal" Height="50">
        <TextBlock Text="{Binding Name}"/>
        implement this-->
        <TextBlock Text = amount of items currently filled.
        <TextBlock Text="{Binding ItemCount}"/>
    </StackPanel>
</Expander.Header>

我已经为我的集合和项目实现了propertychanged。我猜它需要某种转换器,有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

根据this article,您的群组样式在Xaml中必须如下所示:

 <local:PercentageConverterx:Key="percentageConverter" />
//...
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Name}"/>
                            <TextBlock Text="{Binding Converter={StaticResource percentageConverter} }"/>
                            <TextBlock Text="{Binding ItemCount}"/>
                        </StackPanel>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
       </DataGrid.GroupStyle>

其中

public class PercentageConverter: IValueConverter
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        CollectionViewGroup cvg = value as CollectionViewGroup;
        int count = 0;
        int check = 0;
        foreach (Item t in cvg.Items)
        {
            count++;
            if (t.IsCheck== true)
                check++;
        }
        return (check / (double)count).ToString("0.00") + "%";
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

请注意,我假设 CollectionViewSource.Source 属性设置为 ObservableCollection ,其中Item是这样的:

public class Item
{
     public string Name {get; set; }
     public bool? IsChecked { get; set; }
}  

绑定到三态 CheckBox