c# – 如何向Grouped WPF Datagrid项添加其他属性计数?

我有一个
WPF应用程序,它与第三方应用程序通信以收集更新.

然后将这些更新放入Updates Collection并显示到Datagrid中.

更新类:

public class UpdateEntry
{
    public string UserID { get; set; }
    public string UserName { get; set; }
    public DateTime TimeOfUpdate { get; set; }
    public string Reference { get; set; }
}

根据本教程:http://wpftutorial.net/DataGrid.html

我按UserName字段对结果进行了分组:

Updates = CollectionViewSource.GetDefaultView(UserUpdates);
GroupedUpdates = new ListCollectionView(UserUpdates);
GroupedUpdates.GroupDescriptions.Add(new PropertyGroupDescription("UserName"));

并且能够根据ItemCount属性显示更新条目的数量,如下所示:

<TextBlock Text="{Binding Path=Name}" />
<TextBlock Text="{Binding Path=ItemCount}" Margin="8,0,4,0"/>
<TextBlock Text="Updates"/>

我想要做的是在UpdateEntry Count旁边显示一个引用计数,即.每人的参考人数(UserName).

仅供参考:每个参考和每个人有多个更新.

我有一个用户摘要类,它有助于填充名称和存储每个用户的Handled References数量,但我不确定如何在DataGrid的上下文中使用它:

public UserSummary(){ HandledReferences = new List<ReferenceInstance>();}

    public string UserID {get;set;}

    public string UserName {get;set;}

    public List<Models.ReferenceInstance> HandledReferences {get;set;}

    public int NumberOfReferences { get { return HandledReferences.Count; }}

为了简单和简洁,我排除了一些字段

这是我想要实现的一个例子:

Bobby Boo – 更新:4参考文献:2

> UserID:BB03,用户名:Bobby Boo,时间:10:24,参考:A11
> UserID:BB03,用户名:Bobby Boo,时间:10:51,参考:A11
> UserID:BB03,用户名:Bobby Boo,时间:11:54,参考:C99
> UserID:BB03,用户名:Bobby Boo,时间:12:09,参考:C99

Mike Larry – 更新:2参考文献:1

> UserID:NW01,用户名:Mike Larry,时间:15:22,参考:B22
> UserID:NW01,用户名:Mike Larry,时间:17:12,参考:B22

附加信息:

以下是对Datagrid分组上的控制模板的更大看法:

<DataGrid DockPanel.Dock="Left" ItemsSource="{Binding GroupedUpdates}" IsReadOnly="True" Background="LightSlateGray">
        <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Path=Name}" Padding="3"/>
                        </StackPanel>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Expander>
                                        <Expander.Header>
                                            <StackPanel Orientation="Horizontal">
                                                <StackPanel.Resources>
                                                    <Style TargetType="TextBlock">
                                                        <Setter Property="FontSize" Value="13" />
                                                        <Setter Property="FontWeight" Value="Bold" />
                                                        <Setter Property="Foreground" Value="White"/>
                                                    </Style>
                                                </StackPanel.Resources>
                                                <TextBlock Text="{Binding Path=Name}" />
                                                <TextBlock Text="{Binding Path=ItemCount}" Margin="8,0,4,0"/>
                                                <TextBlock Text="Updates"/>
                                            </StackPanel>
                                        </Expander.Header>
                                        <ItemsPresenter />
                                    </Expander>
                                </ControlTemplate>

以及我试图捕获的双重分组/数字的屏幕截图:

最佳答案 如果只能从UpdateEntry列表中计算NumberOfReferences,则可以绑定到GroupItem的控件模板中的Items,并实现IValueConverter,它返回必要的值(ReadOnlyObservableCollection< Object> => int).仅供参考,数据上下文是CollectionViewGroup.

如果逻辑更复杂,您可以继承CollectionViewGroup(并根据需要将其命名为UserSummary),然后将ListCollectionView子类化为使用您的组,然后实现您需要的任何逻辑.

XAML

<Control.Resources>
    <local:ReferencesConverter x:Key="ConvertReferences"/>
</Control.Resources>

<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding ItemCount}"/>
<TextBlock Text="Updates"/>
<TextBlock Text="{Binding Items, Converter={StaticResource ConvertReferences}}"/>
<TextBlock Text="References"/>

C#

public class ReferencesConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == DependencyProperty.UnsetValue)
            return DependencyProperty.UnsetValue;

        var collection = (ReadOnlyObservableCollection<object>)value;
        var updateEntries = collection.Cast<UpdateEntry>();

        // TODO Return number of references
    }

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

笔记:

>代码未经测试.
> IValueConverter.您可以通过Google搜索找到更多示例.
>如果您需要更深层次的组,请检查您在转换方法中收到的项目类型.

点赞