我有一个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>
以及我试图捕获的双重分组/数据的屏幕截图:
答案 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();
}
}
注意:
Convert
方法收到的项目类型。