c# - 如何向分组的 WPF 数据网格项添加额外的属性计数?

标签 c# wpf datagrid

我有一个 WPF 应用程序,它与第 3 方应用程序通信以从中收集更新。 然后将这些更新放入更新集合并显示在数据网格中。

更新类:

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 旁边显示一个Reference Count> 计数,即。每个人 (UserName) 的引用数量。

仅供引用:每个引用和每个人都有多个更新。

我确实有一个用户摘要类,它有助于填充名称和存储每个用户处理的引用数,但我不确定如何在 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

  • 用户 ID:BB03,用户名:Bobby Boo,时间:10:24,编号:A11

  • 用户 ID:BB03,用户名:Bobby Boo,时间:10:51,编号:A11

  • 用户 ID:BB03,用户名:Bobby Boo,时间:11:54,编号:C99

  • 用户 ID:BB03,用户名:Bobby Boo,时间:12:09,编号:C99

Mike Larry - 更新:2 引用:1

  • 用户 ID:NW01,用户名:Mike Larry,时间:15:22,编号:B22

  • 用户 ID:NW01,用户名:Mike Larry,时间:17:12,编号:B22

附加信息:

下面是 Datagrid 分组上的控件模板的更大 View :

<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

最佳答案

如果你能算出NumberOfReferences仅来自 UpdateEntry 的列表, 你可以绑定(bind)到 ItemsGroupItem 的控制模板中并实现 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();
    }
}

注意事项:

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

关于c# - 如何向分组的 WPF 数据网格项添加额外的属性计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25588053/

相关文章:

c# - 如何使用ArrayList的 "CopyTo"方法到另一个ArrayList对象?

c# - 如何取消订阅 MvvmCross 中的 WeakSubscribe

WPF 数据网格选择问题

wpf - 当 DataGrid 中进行数据绑定(bind)时,CommandParameter 未传递到 CanExecute(CanExecute 参数为 null)

c# - 通过 WPF 发送电子邮件使应用程序关闭

c# - 错误处理 MVC View 与 PartialView

c# - TFS服务器需要安装什么

wpf - 如何在 WPF 中为 Visual Studio 属性窗口创建自己的类别?

加载项中的 WPF LifeCyle

Python:创建网格