WPF DataGrid-standardmäßig Sortieren funktioniert nicht
Ich habe ein DataGrid Spalten, in XAML wie folgt:
<DataGridTextColumn Header="Time" Binding="{Binding Date, StringFormat='yyyy-MM-dd HH:mm:ss'}" SortMemberPath="Date" SortDirection="Descending" Width="130" CanUserResize="True" />
<DataGridTextColumn Header="Level" Binding="{Binding Level}" Width="60" CanUserResize="True" />
<DataGridTextColumn Header="Source" Binding="{Binding Logger}" Width="150" CanUserResize="True" />
<DataGridTextColumn Header="Message" Binding="{Binding Message}" Width="*" CanUserResize="True" />
Ich Binde dieses zu einem ObservableCollection<EalsLogEvent>
, wo EalsLogEvent.Date
eingegeben wird DateTime
:
public ObservableCollection<EalsLogEvent> LogEvents
{
get
{
return _logEvents;
}
}
Raster viewmodel verwendet einen timer, um selbst aktualisieren, und alles scheint in Ordnung mit dem Netz, außer beim ersten laden, auf app startup. Dann, die Time
Spalte sortiert werden, absteigend, sondern aufsteigend sortiert ist.
Um die Art Recht hat, muss ich Sie auf die Spaltenüberschrift, zweimal; das erste mal, ändert sich die Reihenfolge aufsteigend, die nun mit dem Inhalt von der Spalte. Der zweite Klick auf die Spaltenüberschrift ändert seine Art, um wieder absteigend, und dieses mal ist es sortiert die Spalte Inhalt richtig, d.h. absteigend.
Wenn ich LINQ, um die Reihenfolge der Auflistung bei _logEvents
aktualisiert, verliere ich welche, um den Benutzer gesetzt hatten, die Spalte durch klicken auf Ihren header. Wenn ich die anzeigen sagen, das Modell, das um die LINQ Sortieren Sie verwenden sollten, etwas riecht schlecht.
- Haben Sie versucht, eine
CollectionView
für die Sortierung? - Ich glaube, ich hatte irgendwann den Weg zurück, aber werde wieder versuchen heute. Alle verfügbaren Referenzen sagen mir die
DataGrid
soll, um an seinen eigenenCollectionView
oder einer seiner drei Derivate. - Wie kann ich ersetzen
ObservableCollection
mit jedemCollectionView
oder deren Unterklassen,ListCollectionView
undBindingListCollectionView
wenn keine dieser generischen währendObservableCollection
ist?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man eine
CollectionViewSource
im XAML-Code definieren die default-Sortierung.Angenommen, wir haben einen Blick Modell:
Wir können erstellen Sie eine benutzerdefinierte
CollectionView
für dieItems
Sammlung:Mit diesem Ansatz zugrunde liegenden source-Sammlung (
Items
in diesem Beispiel) wird davon nicht betroffen sein, die Sortierung erfolgt nur in der Ansicht.Wie Sie Lesen können in MSDN:
Sollten Sie auch Folgendes beachten:
So, mit der
CollectionViewSource
man nur so definieren Sie einen benutzerdefinierten Blick für Ihre Sammlung.System.Timer
) im viewmodel, dass UmfragenEalsLogEvent
Datenquelle (DbSet
) regelmäßig zu aktualisieren, selbst wenn Zeilen Hinzugefügt, dass die Tabelle die ganze Zeit, von überall, über NLog. Damit der timer-thread zu aktualisieren, derDataGrid
verbringe ich die AnsichtDispatcher
durch den ctor:_viewModel = new LogViewModel(Dispatcher)
. Erstellen von viewmodel innen den Blick nicht lassen Sie mich dies tun. Sehr damit beschäftigt, um zu sehen, obViewModelLocator
könnte mir helfen.SortMemberPath
undSortDirection
Eigenschaften auf der Zeile selbst sind alle, die erforderlich ist. Ist das nicht dieDataGrid
soll verwenden Sie diese XAML-Eigenschaften, wenn es baut, ist es eigen, StandardCollectionView
?SortDirection
Attribut-set auf der Säule in Frage, wenn Sie möchten, dass das raster ursprünglichen visuellen Zustand zu reflektieren, die aktive Art (d.h. zeigen einen kleinen Pfeil in der Spaltenüberschrift). Diese Lösung funktioniert, aber ich wünschte, ich Verstand, warum es notwendig ist. Vielleicht ist die Art angewendet wird, zunächst, wenn das grid leer ist und nicht nachträglich aktualisiert, wenn databinding-Auftritt?