2011-07-17 3 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名にバインドしたいということです。 - そのレベルのgroupint = 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誰かが同様の問題を抱えています。

関連する問題