Existe-t-il un moyen de trier un WPF DataGrid par programmation (par exemple, comme si je cliquais sur ma première colonne).
Existe-t-il un moyen de simuler ce clic? Ou une meilleure façon?
Voici mon code:
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));
Je ne sais pas pourquoi, mais la ligne "dv.Sort =" strEvtType ";" cause une chose étrange, ma fenêtre s'affiche et le programme ne continue pas d'exécuter les lignes suivantes, néanmoins je ne vois pas le tri!
Merci beaucoup,
Meilleures salutations,
Nixeus
la solution de voo ne fonctionnait pas pour moi, ItemsSource
était nulle, probablement parce qu'elle n'était pas directement définie, mais liée. Toutes les autres solutions que j'ai trouvées ici à StackOverflow concernaient uniquement le tri du modèle, mais l'en-tête DataGrid
ne reflétait pas le tri.
Voici une solution appropriée basée sur le script incomplet ici: 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();
}
Dans le cas de votre code, il peut être utilisé comme ceci:
SortDataGrid(myDataGridEvenements, 0, ListSortDirection.Ascending);
Ou en utilisant les valeurs des paramètres par défaut, simplement:
SortDataGrid(myDataGridEvenements);
Obtenez le DataView de votre ItemsSource et utilisez sa propriété Sort pour spécifier la colonne selon laquelle vous triez:
(yourDataGrid.ItemsSource as DataView).Sort = "NAME_OF_COLUMN";
PerformSort la méthode du DataGrid est ce qui est réellement exécuté sur le clic d'en-tête d'une colonne. Cependant, cette méthode est interne. Donc, si vous voulez vraiment simuler le clic vous devez utiliser la réflexion:
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] });
}
Ma méthode fonctionne pour moi. Essayez simplement ce code. Désolé pour le russe
// Если таблица пустая, то привязываем ее к журналу
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();
vous pouvez utiliser ICollectionView pour filtrer, trier et regrouper vos éléments dans une grille de données.
EDIT: ajouter Sort, n'a pas lu attentivement la question :)
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;
}