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

时间:2014-08-31 00:53:23

标签: c# 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

我已按用户名字段对结果进行分组:

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 参考 计数 > 计数 ,即。每人的参考人数(用户名)。

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

我有一个用户摘要类,它有助于填充名称并存储每个用户的处理引用数,但我不确定如何在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,UserName:Bobby Boo,时间:10:24,参考:A11

  • UserID:BB03,用户名:Bobby Boo,时间:10:51,参考:A11

  • UserID:BB03,UserName:Bobby Boo,时间:11:54,参考:C99

  • UserID:BB03,UserName:Bobby Boo,时间:12:09,参考:C99

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

  • UserID:NW01,UserName:Mike Larry,时间:15:22,参考:B22

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

其他信息:

以下是对数据网格分组上的控制模板的更大看法:

<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>

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

UserName and Reference Groups Example

1 个答案:

答案 0 :(得分:2)

如果您只能从NumberOfReferences列表中计算UpdateEntry,则可以绑定到Items控件模板中的GroupItem并实施IValueConverter返回必要的值(ReadOnlyObservableCollection<Object> =&gt; 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();
    }
}

注意:

  1. 未经过测试的代码。
  2. IValueConverter。你可以通过谷歌搜索找到更多的例子。
  3. 如果您需要更深入的群组,请检查您使用Convert方法收到的项目类型。