【问题标题】:Displaying amount of "filled" rows in group header WPF在组标题 WPF 中显示“填充”行的数量
【发布时间】:2017-06-30 23:47:46
【问题描述】:

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

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

我的行包含一个文本字段和一个三态复选框,该复选框需要为真或不确定状态才能被视为“填充”的行(默认为假)。我想在组中的总项目中显示组标题中“填充”行的数量。例如,如果我有一个包含 5 个项目的组,并且用户勾选了 2 个复选框,我希望在组标题中看到 2 out of 5 或 2 / 5。我可以设法在 groupheader 中显示名称和 itemcount,但我坚持显示填充行的数量。这是我希望我的组标题的外观。

<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。我猜它需要某种转换器,有人能指出我正确的方向吗?

【问题讨论】:

  • 我认为第一个,您需要使用复选框的 isChecked 属性进行数据绑定,以了解检查了多少个复选框。 2、然后你可以在ViewModel的numOfFilledItems字段的get属性中添加一些代码来统计它。
  • 您是否尝试过使用 IValueConverter
  • 您的包含 Cat 属性的数据对象类型是如何定义的?

标签: c# wpf xaml mvvm converter


【解决方案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

【讨论】:

  • 使用类似的转换器来获取计数。
猜你喜欢
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多