2013-06-06 8 views
17

Есть ли способ сортировки WPF DataGrid programmaticaly (например, как если бы я нажал на свой первый столбец).Сортировка wpf datagrid программно

Есть ли способ имитировать этот клик? Или лучший способ?

Вот мой код:

Collection_Evenements = new ObservableCollection<Evenement>(); 

Collection_Evenements = myEvenement.GetEvenementsForCliCode(App.obj_myClient.m_strCode); 
Collection_Evenements.CollectionChanged += Collection_Evenements_CollectionChanged; 
myDataGridEvenements.ItemsSource = Collection_Evenements; 

System.Data.DataView dv = (System.Data.DataView)myDataGridEvenements.ItemsSource; 
dv.Sort = "strEvtType"; 

myDataGridEvenements.Focus(); 
myDataGridEvenements.SelectedIndex = 0; 
myDataGridEvenements.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 

Я не знаю, почему, но линия "dv.Sort = "strEvtType";" вызывают странную вещь, мой Window Show и программа не продолжают выполнять следующие строки, тем не менее я не вижу сортировку!

Спасибо большое,

С наилучшими пожеланиями,

Nixeus

+0

Не можете вы рассортировать вид DataGrid? И обновить макет? – Alex

+1

есть ли у вас пример? как это сделать? Спасибо –

ответ

7

Получить DataView вашего ItemsSource и использовать его свойство Sort указать столбец сортируют по:

(yourDataGrid.ItemsSource as DataView).Sort = "NAME_OF_COLUMN"; 
+0

Здравствуйте, спасибо за ответ. Каково имя столбца, является ли свойство заголовка? Я не нашел свойство name :( –

+0

@WalterFabioSimoni Нет, это имя столбца вашего источника, которое вы связываете с вашим DataGrid. – Alex

+0

Хорошо, понятно! Тем не менее, когда программа идет по строке .Sort, моя окно программы Показать и это все!Это странно –

0

вы может использовать ICollectionView для фильтрации, сортировки и группировки ваших элементов в datagrid.

EDIT: добавить дешево, не читал этот вопрос тщательно :)

var view = CollectionViewSource.GetDefaultView(this.MyData); 
view.Filter = ViewFilter; 
view.SortDescriptions.Add(new SortDescription("MyPropertyToSort", ListSortDirection.Descending)); 


    private bool ViewFilter(object obj) 
    { 
     var item = obj as MyObject; 

     if (item == null) 
      return false; 

     //your filter logik goes here 

     if(item.MyStringProp.StartsWith("Test")) 
      return false; 

     return true; 


    } 
+0

, если вы не привязываетесь к коллекции объектов, а к datatable - вам нужно использовать IBindingListView.Filter (http://msdn.microsoft.com/de-de/library/system.componentmodel.ibindinglistview_members(v=vs.80) .aspx) – blindmeis

29

решение VOO не работает для меня, ItemsSource был нулевым, скорее всего, потому что он непосредственно не установлен, но оценка. Все остальные решения, которые я нашел здесь в StackOverflow, занимались сортировкой только модели, но заголовок DataGrid не отражал сортировку.

Вот правильное решение, основанное на неполном сценарии здесь: http://dotnetgui.blogspot.co.uk/2011/02/how-to-properly-sort-on-wpf-datagrid.html

public static void SortDataGrid(DataGrid dataGrid, int columnIndex = 0, ListSortDirection sortDirection = ListSortDirection.Ascending) 
{ 
    var column = dataGrid.Columns[columnIndex]; 

    // Clear current sort descriptions 
    dataGrid.Items.SortDescriptions.Clear(); 

    // Add the new sort description 
    dataGrid.Items.SortDescriptions.Add(new SortDescription(column.SortMemberPath, sortDirection)); 

    // Apply sort 
    foreach (var col in dataGrid.Columns) 
    { 
     col.SortDirection = null; 
    } 
    column.SortDirection = sortDirection; 

    // Refresh items to display sort 
    dataGrid.Items.Refresh(); 
} 

В случае вашего кода, он может быть использован как это:

SortDataGrid(myDataGridEvenements, 0, ListSortDirection.Ascending); 

Или с помощью значений параметров по умолчанию , просто:

SortDataGrid(myDataGridEvenements); 
+0

Удивительный метод, простой в использовании и модификации. Благодарю. –

0

Мой метод работы для меня. Просто попробуйте этот код. К сожалению для русского

// Если таблица пустая, то привязываем ее к журналу 
      if(dgEvents.ItemsSource == null) 
       dgEvents.ItemsSource = events.Entries; 
      // Обновляем записи 
      CollectionViewSource.GetDefaultView(dgEvents.ItemsSource).Refresh(); 
      // Очищаем описание сортировки 
      dgEvents.Items.SortDescriptions.Clear(); 
      // Созадем описание сортировки 
      dgEvents.Items.SortDescriptions.Add(new SortDescription(dgEvents.Columns[0].SortMemberPath, ListSortDirection.Descending)); 

      // Очищаем сортировку всех столбцов 
      foreach (var col in dgEvents.Columns) 
      { 
       col.SortDirection = null; 
      } 
      // Задаем сортировку времени по убыванию (последняя запись вверху) 
      dgEvents.Columns[0].SortDirection = ListSortDirection.Descending; 
      // Обновляем записи 
      dgEvents.Items.Refresh(); 
0

PerformSort метод DataGrid является то, что на самом деле выполняются на столбец заголовка мыши. Однако этот метод является внутренним. Так что если вы действительно хотите имитировать щелчок вам нужно использовать отражение:

public static void SortColumn(DataGrid dataGrid, int columnIndex) 
{ 
    var performSortMethod = typeof(DataGrid) 
          .GetMethod("PerformSort", 
             BindingFlags.Instance | BindingFlags.NonPublic); 

    performSortMethod?.Invoke(dataGrid, new[] { dataGrid.Columns[columnIndex] }); 
} 
Смежные вопросы