2009-10-26 20 views
24

Mam DataGrid w aplikacji WPF z kilkoma kolumnami, w tym kolumna Nazwa. Jeśli użytkownicy przełączają się na określony widok, chcę, aby dane zostały wstępnie posortowane według nazwy (i chciałbym, aby strzałka sortowania pojawiła się w nagłówku nazwy tak, jakby użytkownik kliknął ten nagłówek). Jednak nie mogę znaleźć oczekiwanych właściwości, aby tak się stało. Szukałem czegoś podobnego SortColumn, SortColumnIndex, SortDirection itpWstępne sortowanie DataGrid w WPF

Czy to możliwe, aby określić domyślny kolumny sortowania i kierunek w znacznikach (XAML) lub że nie jest obsługiwana przez WPF Toolkit DataGrid?

+0

Ponieważ WPF nie pochodzi z DataGrid zbudowany, możemy założyć, masz na myśli, że pochodzi z DataGrid WPF Toolkit (http://www.codeplex.com/wpf) ??? –

+0

Tak, umieściłem tag wpftoolkit, ale myślę, że nie wspomniałem o tym w moim pytaniu. Dodam to. – devuxer

Odpowiedz

38

Zakładając, że mówisz o sterowaniu DataGrid Toolkit DataGrid, musisz ustawić tylko the CanUserSortColumns property na true, a następnie ustawić the SortMemberPath property każdej kolumny DataGridColumn w DataGrid.

Jeśli chodzi o sortowanie kolekcji początkowo, należy użyć źródła CollectionViewSource i ustawić sortowanie na tym, a następnie przypisać go jako ItemsSource swojej DataGrid. Jeśli robisz to w XAML to byłoby tak proste, jak:

<Window.Resources> 
    <CollectionViewSource x:Key="MyItemsViewSource" Source="{Binding MyItems}"> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription PropertyName="MyPropertyName"/> 
     </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 
</Window.Resources> 

<DataGrid ItemsSource="{StaticResource MyItemsViewSource}"> 

</DataGrid> 

UWAGA: map z „SCM” namespace prefiks System.ComponentModel gdzie mieszka klasa SortDescription.

xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" 

EDIT: myślę wystarczająco dużo ludzi dostaje pomoc z tym poście, że ten upvoted komentarz powinny być zawarte w tej odpowiedzi:

musiałem to wykorzystać, aby zmusić go do pracy:

<DataGrid ItemsSource="{Binding Source={StaticResource MyItemsViewSource}}"> 
+0

@Drew, dziękuję, ale 'SortMemberPath' właśnie określa, które pole w źródle danych idzie z jaką kolumną w DataGrid. Muszę ustawić * bieżącą * kolumnę sortowania (i kierunek). Np. Ta DataGrid jest obecnie posortowana rosnąco według nazwy. – devuxer

+1

Cóż, jak rozwiązać "kliknięcie nagłówka kolumny i problem z sortowaniem". Przypadkowo pominąłem, jak początkowo sortować siatkę, dodam do mojej odpowiedzi teraz. –

+5

Tak :) To znacznie bliższe temu, czego szukałem, dzięki. Jedynym problemem jest to, że strzałka sortowania nie pojawia się w nagłówku kolumny, w której tabela jest sortowana. Mogę z tym żyć, ale strzałka sprawi, że czytelnik będzie trochę bardziej czytelny, jaka jest kolumna sortowania. Dla każdego, kto próbuje to zrobić, wystarczy odwołać się do 'WindowsBase', aby użyć' System.ComponentModel'. Po dodaniu odnośnika potrzebujesz tego: 'xmlns: scm =" clr-namespace: System.ComponentModel; assembly = WindowsBase "'. – devuxer

2

Kiedy widzisz ItemsSource doesn't support CollectionViewSource wyjątek można sortować kolekcję przez Linq przed skierować ją do DataGrid:

ObservableCollection<MyDataClass> myCollection = new ObservableCollection<MyDataClass>(); 
dataGrid.ItemsSource = from item in myCollection orderby item select item; 

Trzeba wdrożyć IComparable interfejs MyDataClass:

public class MyDataClass : IComparable<MyDataClass> { 
    public int CompareTo(Classified other) { 
     return other.Value.CompareTo(this.Value); // DESC 
     return this.Value.CompareTo(other.Value); // ASC 
    } 
} 
+0

To faktycznie zadziałało dla mnie, gdy próbowałem zamówić Linię do Bindowania za pomocą Lambda. To zadziałało, Lambda nie! – DerpyNerd

4

Kiedy widzisz ItemsSource nie obsługuje wyjątek CollectionViewSource następnie można ustawić DataContext DataGrid jako „MyItemsViewSource” i ItemsSource jako {Binding} tak :

<DataGrid DataContext="{StaticResource MyItemsViewSource}" ItemsSource="{Binding}"> 
</DataGrid> 
+1

Wracam do tego posta (trzeci raz w tym roku), ponieważ zapomniałem zrobić tę ważną część/fragment układanki! Dziękujemy za opublikowanie. –

19

wiem, że to stary post, ale oprócz odpowiedzi Drew Marsh oraz w odpowiedzi na kwestię Nm jest ze strzałkami nagłówek kolumny nie pojawia ... trzeba dodać właściwość SortDirection do th e DataGridColumn:

<DataGridTextColumn Header="Name" Binding="{Binding Name}" SortDirection="Ascending" /> 

Zamieściłem pytanie o to i znaleźć odpowiedź kilka dni później:

ColumnHeader arrows not reflected when sorting a DataGrid in XAML

+0

To oznacza, że ​​właściwość 'SortDirection' musi ręcznie dopasowywać kolumny w' SortDescription' - czy istnieje sposób, aby DataGrid wykrył sortowanie CollectionViewSource i wyświetlił wskaźniki automatycznie? – Dai

0

Działa to dla mnie.

ListSortDirection sortDirection; 
int selectedColumnIndex; 
private void customerDataGrid_Sorting(object sender, DataGridSortingEventArgs e) 
{ 
    selectedColumnIndex = e.Column.DisplayIndex; 
    sortDirection = (e.Column.SortDirection == ListSortDirection.Ascending ? ListSortDirection.Descending: ListSortDirection.Ascending); 
} 

private void applySortDescriptions(ListSortDirection listSortDirection) 
{ 
    //Clear current sort descriptions 
    customerDataGrid.Items.SortDescriptions.Clear(); 

    //Get property name to apply sort based on desired column 
    string propertyName = customerDataGrid.Columns[selectedColumnIndex].SortMemberPath; 

    //Add the new sort description 
    customerDataGrid.Items.SortDescriptions.Add(new SortDescription(propertyName, listSortDirection)); 

    //apply sort 
    applySortDirection(listSortDirection); 

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

private void applySortDirection(ListSortDirection listSortDirection) 
{ 
    customerDataGrid.Columns[selectedColumnIndex].SortDirection = listSortDirection; 
}