Отступ DataGrid.GroupStyle для дополнительных описаний GroupDescription - PullRequest
1 голос
/ 17 июля 2011

Я использую ListCollectionView в качестве ItemsSource для WPF DataGrid.

Я хочу, чтобы пользователь мог добавлять столбцы в группу, и в качестве GroupStyle я использую следующее:

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

Моя проблема в том, что когда в описании группы более 1 столбца, заголовки групп отображаются без отступов. Другая проблема заключается в том, что я хотел бы, чтобы TextBox с именем группы: связывался с именем столбца, группирующим этот уровень - поэтому, если я нахожусь на этом уровне в столбце = Gender, он говорит: «Gender:».

Итак, как я могу сделать отступ для заголовка группы в соответствии с уровнем его вложенности в коллекции GroupDescription и как связать его с именем столбца?

1 Ответ

3 голосов
/ 20 июля 2011

Никто не подошел к этому, поэтому, много поработав, я нашел следующее решение.Я создал преобразователь с несколькими значениями, взяв в качестве параметров текущую 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 - для более удобного заголовка столбца.похожая проблема.

...