我有一个
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搜索找到更多示例.
>如果您需要更深层次的组,请检查您在转换方法中收到的项目类型.