2011-12-19 14 views
10

Chcę określić domyślną kolejność przy uruchamianiu, ale nadal zezwalam użytkownikowi na sortowanie, klikając nagłówki kolumn. Niestety właściwość SortDirection jest ignorowana, gdy jest ustawiona - tzn. Otrzymujemy poprawną strzałkę nagłówka kolumny, ale nic nie jest sortowane.DataGrid SortDirection zignorowano

Kliknięcie nagłówków ręcznie powoduje prawidłowe sortowanie danych, więc nie jest to samo sortowanie. Jest to uproszczona wersja używam:

<DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=CurrentView}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Header 1" Binding="{Binding ApplicationName}"/> 
     <DataGridTextColumn Header="Header 2" 
       Binding="{Binding TotalTime}" SortDirection="Descending"/> 
    </DataGrid.Columns> 
</DataGrid> 

Aktualizacja: Próbowałem też dodanie SortDescriptions do ICollectionView jak zaproponowano, bez dobrych rezultatów. Czy to może mieć coś wspólnego z faktem, że dynamicznie dodawam nowe elementy do kolekcji? To znaczy. przy uruchomieniu lista jest pusta i powoli wypełniona, a może opis sortowania jest stosowany tylko raz?

Odpowiedz

9

Spójrz na tego MSDN Blog

Od wyżej linku:

DataGridColumn.SortDirection faktycznie nie posortować kolumnę.
Metoda DataGridColumn.SortDirection służy do umieszczania w kolejce strzałki wizualnej w obiekcie DataGridColumnHeader w celu wskazywania w górę, w dół lub nie pokazywania. Aby rzeczywiście posortować kolumny inne niż kliknięcie obiektu DataGridColumnHeader, można programowo ustawić obiekt DataGrid.Items.SortDescriptions.

+0

Próbowałem zarówno z 'datagrid.Items' i aktualnym ICollectionView, którego używam, ale wyniki są takie same: negative :( – Voo

+0

Po krótkiej myśli: Może to ma co zrobić ze mną dynamicznie dodając nowe pozycje do listy? – Voo

+0

@Voo możesz chcieć spojrzeć na ten [Blog MSDN] (http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/ c943e22e-5fdf-469d-9e92-fa0167dc9d62) .Zapoznaj się z opcją sortDescription i zastosuj ponownie, aby wymusić ucieczkę –

4

Nie mam żadnych osobistych doświadczeń z tym, ale znalazłem this rather helpful article.

Zasadniczo należy dodać SortDescription do źródła CollectionViewSource, do którego powiązana jest DataGrid.

+0

utworzyć CVS i dodać do tego kierunek sortowania, a nie ObservableCollection. OC używają metody Move do sortowania wierszy. – Xcalibur37

+0

@Xcalibur Obawiam się, że mój wpf/xaml/jakiekolwiek lingo jest nieco ograniczone, więc czy mógłbyś to przetłumaczyć? W każdym razie próbowałem dodać sortDescriptions zarówno do 'datagrid.Items' i ICollectionView, którego datagrid używa jako źródło bez powodzenia. – Voo

+0

Tutaj również, więc nie jest stracone: Czy to może mieć coś wspólnego ze mną dynamicznie dodając nowe pozycje do listy? – Voo

1

Krótko mówiąc, nie ma szybkiej i łatwej metody. Napisałem własny niestandardowy sorter, który używa metody Move w ObservableCollections. Nadpisuję zdarzenie "DataGridSorting" i wywołuję własne metody, aby to ułatwić. Nie będę tu publikował kodu, ponieważ uważam, że jest zbyt przesadzony na twoje pytanie.

powiedziałbym kij z moim powyższym komentarzem użyciu CollectionViewSource i SortDescription (competent_tech Cytat).

2

Ten artykuł był bardzo pomocny. Udało mi się go użyć, aby znaleźć nieco proste rozwiązanie. Oto fragment mojego rozwiązania, które działało.

XAML

 <DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
      AutoGenerateColumns="False" ItemsSource="{Binding LogLister.Logs}"    
      IsReadOnly="True" > 

      <DataGrid.Columns>     

       <DataGridTextColumn Binding="{Binding TimeStampLocal}" Header="Time" x:Name="ColTimeStamp" /> 

       <DataGridTextColumn Binding="{Binding Text}" Header="Text"/> 
      </DataGrid.Columns> 
     </DataGrid> 

Kod

// Using a DependencyProperty as the backing store for ViewModel. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ViewModelProperty = 
     DependencyProperty.Register("ViewModel", typeof(LogViewerViewModel), typeof(LogViewerControl), 
      new UIPropertyMetadata(null,pf_viewModelChanged)); 

    private static void pf_viewModelChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     var control = (LogViewerControl)o; 

     control.ColTimeStamp.SortDirection = ListSortDirection.Descending; 

     var vm = e.NewValue as LogViewerViewModel; 

     if (vm != null) 
     { 
      ICollectionView collectionView = CollectionViewSource.GetDefaultView(vm.LogLister.Logs); 
      collectionView.SortDescriptions.Add(new SortDescription("TimeStampLocal", ListSortDirection.Descending)); 
     } 
    }