Ordina un datagrid wpf a livello di programmazione

C’è un modo per ordinare programmaticamente una WPF DataGrid (per esempio, come se avessi fatto clic sulla mia prima colonna).

C’è un modo per simulare questo clic? O un modo migliore?

Ecco il mio codice:

Collection_Evenements = new ObservableCollection(); 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)); 

Non so perché, ma la riga “dv.Sort =” strEvtType “;” causa una cosa strana, il mio Window Show up e il programma non continuano ad eseguire le righe successive, tuttavia non vedo il genere!

Molte grazie,

I migliori saluti,

Nixeus

La soluzione di voo non funzionava per me, ItemsSource era nullo, molto probabilmente perché non era impostato direttamente, ma vincolato. Tutte le altre soluzioni che ho trovato qui su StackOverflow riguardavano solo l’ordinamento del modello, ma l’intestazione DataGrid non rifletteva l’ordinamento.

Ecco una soluzione adeguata basata sullo script incompleto qui: 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(); } 

Nel caso del tuo codice, può essere usato in questo modo:

 SortDataGrid(myDataGridEvenements, 0, ListSortDirection.Ascending); 

O utilizzando i valori dei parametri predefiniti, semplicemente:

 SortDataGrid(myDataGridEvenements); 

Ottieni il DataView del tuo ItemsSource e usa la sua proprietà Sort per specificare la colonna che stai ordinando in base a:

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

puoi usare ICollectionView per filtrare, ordinare e raggruppare i tuoi articoli in un datagrid.

EDIT: aggiungi Ordina, non ha letto la domanda attentamente 🙂

  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; } 

Il mio metodo è lavoro per me. Prova questo codice. Ci scusiamo per il russo

 // Если таблица пустая, то привязываем ее к журналу 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(); 

Il metodo PerformSort di DataGrid è ciò che viene effettivamente eseguito sul click dell’intestazione di una colonna. Tuttavia questo metodo è interno. Quindi se vuoi veramente simulare il click devi usare la reflection:

 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] }); }