2011-07-17 5 views
1

ListCollectionView를 WPF DataGrid의 ItemsSource로 사용하고 있습니다. 하여하는 GroupStyle으로 다음추가 GroupDescriptions에 대한 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> 

내 문제는 그 GroupDescriptions 더 후 1 열이있을 때 그룹 제목은 들여 쓰기없이 표시됩니다. 또 다른 문제는 "Group Name :"이있는 TextBox가 해당 레벨을 그룹화하는 Column 이름에 바인딩되기를 바라는 것입니다. 따라서 groupType이 column = Gender 인 경우 "Gender :"라고 표시됩니다.

GroupDescriptions 컬렉션의 중첩 수준에 따라 그룹 머리글을 들여 쓰려면 어떻게해야하며 어떻게 열 이름에 바인딩 할 수 있습니까?

답변

3

아무도이 문제에 아무런 조치도 취하지 않았으므로 다음과 같은 해결책을 생각해 냈습니다. 현재 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는 더 친숙한 열 머리글을 가져 오는 데 사용됩니다.

HTH 누군가 유사한 문제가 발생했습니다.