Wpf 缩进DataGrid.GroupStyle以获取其他GroupDescriptions
我使用ListCollectionView作为WPF数据网格的ItemsSource 我希望用户能够将列添加到group by,并且我使用以下作为GroupStyle:Wpf 缩进DataGrid.GroupStyle以获取其他GroupDescriptions,wpf,grouping,wpfdatagrid,converter,Wpf,Grouping,Wpfdatagrid,Converter,我使用ListCollectionView作为WPF数据网格的ItemsSource 我希望用户能够将列添加到group by,并且我使用以下作为GroupStyle: <DataGrid.GroupStyle> <GroupStyle> <GroupStyle.ContainerStyle> <Style TargetType="{x:Type GroupItem}">
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander>
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Group Name: "/>
<TextBlock Text="{Binding Path=Name}" FontWeight="Bold"/>
<TextBlock Text=" "/>
<TextBlock Text="{Binding Path=ItemCount}" FontStyle="Italic"/>
<TextBlock Text=" Items" FontStyle="Italic"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter>
</ItemsPresenter>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
我的问题是,当GroupDescriptions中有超过1列时,组标题将显示而不缩进。另一个问题是,我希望具有“groupname:”的文本框绑定到对该级别进行分组的列名-因此,如果我是Column=Gender上该级别的groupint,它将显示“Gender:”
那么,如何根据组标题在GroupDescriptions集合中的嵌套级别缩进组标题,以及如何绑定到列名呢?没有人提到这一点,因此经过大量的修改,我提出了以下解决方案。我创建了一个多值转换器,将当前CollectionViewGroup、整个ListCollectionView和DataGrid作为参数
Public Class GroupLevelConverter
Implements IMultiValueConverter
Public Function Convert(values() As Object, targetType As System.Type,
parameter As Object, culture As System.Globalization.CultureInfo
) As Object Implements System.Windows.Data.IMultiValueConverter.Convert
If TypeOf values(0) Is CollectionViewGroup Then
Dim level As Integer = 0
Dim parent As CollectionViewGroup = values(0)
Do While parent IsNot Nothing
parent = GetParent(values(0))
values(0) = parent
If parent IsNot Nothing Then
level += 1
End If
Loop
Dim s As String = ""
For i = 1 To level - 1
s += " "
Next
Dim lcv As ListCollectionView = DirectCast(values(1), ListCollectionView)
Dim pgd As System.Windows.Data.PropertyGroupDescription = lcv.GroupDescriptions(level - 1)
Dim dg As DataGrid = values(2)
Dim GroupHeader As String = pgd.PropertyName
For c = 0 To dg.Columns.Count - 1
If dg.Columns(c).SortMemberPath = GroupHeader Then
GroupHeader = dg.Columns(c).Header
Exit For
End If
Next
s = s & GroupHeader & ": "
Return (s)
End If
Return ""
End Function
Public Function ConvertBack(value As Object, targetTypes() As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object() Implements System.Windows.Data.IMultiValueConverter.ConvertBack
Throw New NotSupportedException("Not implemented")
End Function
Friend Function GetParent(currentViewGroup As CollectionViewGroup) As CollectionViewGroup
Dim parent As CollectionViewGroup
Try
parent = TryCast(currentViewGroup.[GetType]().GetProperty("Parent", System.Reflection.BindingFlags.GetProperty Or
System.Reflection.BindingFlags.Instance Or
System.Reflection.BindingFlags.NonPublic).GetValue(currentViewGroup, Nothing),
CollectionViewGroup)
Catch ex As Exception
Return Nothing
End Try
Return parent
End Function
End Class
CollectionViewGroup用于使用GetParent函数查找其父级。这是解决方案中不优雅的部分,因为它依赖于捕获错误。调用该函数,直到错误指示到达顶部组为止
ListCollectionView用于获取排序列,DataGrid用于获取更友好的列标题
有人在看一个类似的问题