2012-04-27 3 views
1

나는 다음과 같은 코드가 있습니다 WPF에서 DataGrid 그룹 순서를 강제로 적용하는 방법?

StatusItems = new ObservableCollection<StatusItem> { }; 
StatusItemsGrouped = new ListCollectionView(StatusItems); 
StatusItemsGrouped.GroupDescriptions.Add(new PropertyGroupDescription("GenericStatus")); 
StatusItemsGrouped.SortDescriptions.Add(new SortDescription("GenericStatus", ListSortDirection.Descending)); 

는 기본적으로 나는 GenericStatus라는 정보를 기반으로 DataGrid에 데이터를 그룹화하고 있습니다. 정렬을 제외하고 모두 괜찮습니다. 지금 달성하고자하는 것은 내 코드에서와 같이 내림차순으로 그룹을 정렬하는 것이지만 위 코드의 문제점은 사용자가 일부 열을 클릭하자마자 정렬이 망가지는 것입니다.

그룹 분류 인 을 유지하려고하지만 여전히 사용자 정렬 허용. 사용자 정렬은 기본적으로 제 2 차 정렬 일 것입니다. 즉, 이것을 원합니다 : ORDER BY GenericStatus DESC, UsersColumnOfChoise ASC/DESC.

답변

1

"명령"으로 각 열 클릭을 설정 한 다음 실행할 명령을보고 GenericStatus와 함께 정렬 된 열로 추가 할 수 있습니다.

CommandStub 만들기 :

private bool sortAscending; 
private CommandStub _sortList; 
public ICommand sortList { 
    get { 
     if (_sortList == null) { 
      _sortList = new CommandStub(); 
      _sortList.OnExecuting += new CommandStub.ExecutingEventHandler(_sortList_OnExecuting); 
     } 

     return _sortList; 
    } 
} 

void _sortList_OnExecuting(object parameter) { 

    var sortColumn = (string)parameter; 
    StatusItems.SortDescriptions.Clear(); 

    if (sortAscending) { 
     // Always sort first by GenericStatus 
     StatusItems.SortDescriptions.Add(new SortDescription("GenericStatus", ListSortDirection.Ascending)); 

     // Sort by the column clicked 
     StatusItems.SortDescriptions.Add(new SortDescription(sortColumn, ListSortDirection.Ascending)); 
     this.sortAscending = false; 
    } else { 
     // Always sort first by GenericStatus 
     StatusItems.SortDescriptions.Add(new SortDescription("GenericStatus", ListSortDirection.Descending)); 

     StatusItems.SortDescriptions.Add(new SortDescription(sortColumn, ListSortDirection.Descending)); 
     this.sortAscending = true; 
    } 
} 

각 열 헤더가 그것에 관련된 명령은 사용자가 정렬 클릭 할 때 호출했습니다

var h = new GridViewColumnHeader(); 
h.Command = sortList; 
h.CommandParameter = "deviceName"; 
2

난 그냥이 문제에 달려 나 자신과 내 솔루션은 Sorting 이벤트를 가로 채서 ICollectionView가 DataGrid를 처리하는 대신 ViewModel에서 정렬을 수행하도록하는 것이 었습니다.

XAML :

<DataGrid ItemsSource="{Binding StatusItemsGrouped}" Sorting="OnSorting_"/> 

XAML.CS :

private void OnSorting_(object sender, DataGridSortingEventArgs e) 
{ 
    var viewModel = DataContext as ViewModel; 
    e.Handled = true;         // prevent DataGrid from sorting 
    viewModel.SortItemSource(e.Column);    // perform sorting 
    e.Column.SortDirection = viewModel.SortDirection; // set sort direction icon on column header 
} 

뷰 모델 :

public class ViewModel 
{ 
    public ListCollectionView StatusItemsGrouped { get; set; } 
    public ListSortDirection SortDirection { get; set; } 
    public string SortColumn { get; set; } 

    public void SortItemSource(string columnName) 
    { 
     if (String.Compare(SortColumn, columnName, true) == 0) 
      SortDirection = ListSortDirection.Ascending; 
     else 
      SortDirection = ListSortDirection.Descending; 
     SortColumn = columnName; 
     using(StatusItemsGrouped.DeferRefresh()) { 
      StatusItemsGrouped.GroupDescriptions.Clear(); 
      StatusItemsGrouped.SortDescriptions.Clear(); 
      StatusItemsGrouped.SortDescriptions.Add(new SortDescription(SortColumn, SortDirection)); 
      StatusItemsGrouped.GroupDescriptions.Add(new PropertyGroupDescription("GenericStatus")); 
     } 
     StatusItemsGrouped.Refresh(); 
    } 
} 
+0

훌륭한 대답. 나는 그것을 사용하기 위해 크게 수정했지만 해결책으로 이끌었다. 고맙습니다! –

관련 문제