Vraag Sorteer een wpf datagrid programmatisch


Is er een manier om een ​​WPF DataGrid-programmaticaly te sorteren (bijvoorbeeld, als ik op mijn eerste kolom klikte).

Is er een manier om deze klik te simuleren? Of een beste manier?

Hier is mijn 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));

Ik weet niet waarom, maar de regel "dv.Sort =" strEvtType ";" een raar iets veroorzaken, mijn Window Show-up en het programma niet doorgaan met het uitvoeren van de volgende regels, toch zie ik het soort niet!

Hartelijk bedankt,

Beste wensen,

Nixeus


18
2018-06-06 07:34


oorsprong


antwoorden:


voo's oplossing werkte niet voor mij, ItemsSource was null, hoogstwaarschijnlijk omdat het niet direct ingesteld, maar gebonden was. Alle andere oplossingen die ik hier bij StackOverflow vond, hadden alleen te maken met het sorteren van het model, maar het DataGrid de koptekst was niet hetzelfde.

Hier is een goede oplossing op basis van het onvolledige script hier: 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();
}

In het geval van uw code, kan deze als volgt worden gebruikt:

SortDataGrid(myDataGridEvenements, 0, ListSortDirection.Ascending);

Of door simpelweg de standaard parameterwaarden te gebruiken:

SortDataGrid(myDataGridEvenements);

30
2017-11-13 11:13



Haal de DataView van uw ItemsSource op en gebruik de Sort-eigenschap om de kolom aan te geven waarop u sorteert:

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

7
2018-06-06 07:49



je kunt gebruiken ICollectionView om uw items in een datagrid te filteren, sorteren en groeperen.

EDIT: voeg Sorteren toe, las de vraag niet zorgvuldig :)

 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
2018-06-06 07:55



Mijn methode is werk voor mij. Probeer deze code gewoon. Sorry voor Russisch

// Если таблица пустая, то привязываем ее к журналу 
            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
2017-11-03 06:20



PerformSort methode van de DataGrid is wat feitelijk wordt uitgevoerd op de koptekst van een kolom. Deze methode is echter intern. Dus als je het echt wilt simuleer de klik je moet reflectie gebruiken:

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

0
2017-08-07 14:46