2017-12-29 42 views
0

나는이 ListView 정렬 절차가 있습니다WPF의 DataGridColumn DisplayMemeberBinding

/// <summary> 
    /// Handle the event of clicking on a column header to sort 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void GridViewColumnHeaderClicked(object sender, RoutedEventArgs e) 
    { 
     GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader; 

     if (headerClicked == null) 
      return; 

     if (headerClicked.Role == GridViewColumnHeaderRole.Padding) 
      return; 

>>>  var sortingColumn = (headerClicked.Column.DisplayMemberBinding as Binding)?.Path?.Path; 
     if (sortingColumn == null) 
      return; 

     var direction = ApplySort(Items, sortingColumn); 

     if (direction == ListSortDirection.Ascending) 
     { 
      headerClicked.Column.HeaderTemplate = 
       Resources["HeaderTemplateArrowUp"] as DataTemplate; 
     } 
     else 
     { 
      headerClicked.Column.HeaderTemplate = 
       Resources["HeaderTemplateArrowDown"] as DataTemplate; 
     } 

     // Remove arrow from previously sorted header 
     if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked) 
     { 
      _lastHeaderClicked.Column.HeaderTemplate = 
       Resources["HeaderTemplateDefault"] as DataTemplate; 
     } 

     _lastHeaderClicked = headerClicked; 
    } 

을 그리고 ListView.View를 사용하여 정의 할 때 DisplayMemberBinding과 같이 그것은 잘 작동 : 지금 일부 열을의 요구 사항이

<!-- Name --> 
    <GridViewColumn Width="200" 
        DisplayMemberBinding="{Binding FullName}"> 
     <GridViewColumn.Header> 
     <GridViewColumnHeader Content=" Name" 
           HorizontalContentAlignment="Left" /> 
     </GridViewColumn.Header> 
    </GridViewColumn> 

오른쪽 정렬 그래서이 같은 것을 사용해야합니다 :

<!-- Name --> 
<GridViewColumn Width="200"> 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding FullName}" 
         TextAlignment="Right" /> 
      </DataTemplate> 
    </GridViewColumn.CellTemplate> 
    <GridViewColumn.Header> 
    <GridViewColumnHeader Content=" Name" 
          HorizontalContentAlignment="Left" /> 
    </GridViewColumn.Header> 
</GridViewColumn> 

그러나 이제 정렬 절차 (>>>로 표시된 줄)를 참조 할 때 더 이상 DisplayMemberBinding을 참조 할 필요가 없습니다. CellTemplate ->TextBlock에서 바인딩을 찾는 방법이 있습니까? 스누핑을 사용하여 C# 코드와 XAML 코드를 모두 파고 있지만 바인딩을 찾을 수 없습니다.

+0

첫 번째 아이디어가 효과가 없었기 때문에 첨부 된 속성 아이디어를 더욱 멋지게 만들었습니다. –

답변

0

내가 개인적으로 연결된 속성을 작성합니다

public static class GridViewExt 
{ 
    #region GridViewExt.SortColumnPath Attached Property 
    public static String GetSortColumnPath(GridViewColumn obj) 
    { 
     return (String)obj.GetValue(SortColumnPathProperty); 
    } 

    public static void SetSortColumnPath(GridViewColumn obj, String value) 
    { 
     obj.SetValue(SortColumnPathProperty, value); 
    } 

    public static readonly DependencyProperty SortColumnPathProperty = 
     DependencyProperty.RegisterAttached("SortColumnPath", typeof(String), typeof(GridViewExt), 
      new PropertyMetadata(null, SortColumnPath_PropertyChanged)); 

    private static void SortColumnPath_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var target = d as GridViewColumn; 
    } 
    #endregion GridViewExt.SortColumnPath Attached Property 
} 

사용법 :

private void GridViewColumnHeaderClicked(object sender, RoutedEventArgs e) 
{ 
    GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader; 

    if (headerClicked == null) 
     return; 

    if (headerClicked.Role == GridViewColumnHeaderRole.Padding) 
     return; 

    // ...if DisplayMemberPath is null... 
    var sortingColumn = GridViewExt.GetSortColumnPath(headerClicked.Column); 

    if (sortingColumn == null) 
     return; 

XAML :

<GridViewColumn 
    Width="200" 
    local:GridViewExt.SortColumnPath="FullName" 
    > 
    <GridViewColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding FullName}" 
         TextAlignment="Right" /> 
      </DataTemplate> 
    </GridViewColumn.CellTemplate> 

난 당신이 모두 DisplayMemberBindingCellTemplate을 사용할 수있는 개념을 가지고, 그러나 CellTemplate은 무시 된 경우 DisplayMemberBinding이 사용됩니다.