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