| 

.NET C# Java Javascript Exception

3
Hallo, ich habe hier anscheinend ein Binding-Problem, wenn das überhaupt so machbar ist.
Im Konstruktor der WPF-Form übergebe ich eine ObservableCollection mit dem Namen "Protokoll" an den DataContext.
Nun binde ich zwei idente DataGrids mit ItemsSource="{Binding Protokoll}", funktioniert einwandfrei und sind auch Synchron wenn ich etwas ändere.

Nun zum Problem:
Ich möchte im ersten DataGrid aber nur die Top-10-Ältesten Einträge sehen
z.B. ItemsSource="{Binding Protokoll.OrderByDescending(o => o.Protokollzeit).Take(10)}"
Ich nehme an das funktioniert so wie ich das will nicht, da ja schon die ObservableCollection nicht Sortierbar ist, oder?
News:
16.10.2013
MStrasser 342 1 8
3 Antworten
1
Mit den LINQ-Methode OrderBy und OrderByDescending kannst Du auch eine ObservableCollection sortieren (ist ja auch ein IEnumerable<T>). Je nachdem, wieviele Einträge da drin sind, kann das aber auch langsam sein. Die Top10 ältesten Einträge würde ich als separate Property im ViewModel definieren und bei Änderungen am "Protokoll", die "ProtokollTop10" neu berechnen und wie üblich mit PropertyChanged die Änderung kommunizieren.
Wie gesagt, je nach Anzahl Einträgen und Änderungsfrequenz (und damit Neuberechnung und Neusortierung) musst Du vielleicht noch optimieren. Aber ich würds erstmal so ausprobieren und dann entscheiden.
16.10.2013
ffordermaier 8,4k 3 9
1
Die Antwort lautet: CollectionViews

Schöne Beschreibungen dazu findest Du hier:
http://www.zagstudio.com/blog/387#.UmD_ay_wCHs

Hier wird auch beschrieben wie das Binding in WPF eigentlich funktioniert...
18.10.2013
MaHop 71 4
0
Servus, danke für deine Ausführung:
Diesen Ansatz verfolgte ich anfänglich auch. Sobald ich sortiere bekomme ich eine IEnumerable, diese kann man zwar wieder in eine ObservableCollection umwandeln (p_ProtokollTop10 = new ObservableCollection<Protokoll_Item>(p_Protokoll.OrderBy(o => o.Protokollzeit).Take(10));), aber spätestens mit dem Schlüsselwort NEW ist die Bindung futsch. Ehrlich gesagt bin ich momentan etwas Ratlos.
Entschuldige, ich habe an der falschen Stelle geantwortet, wollte eigentlich auf dein Kommentar antworten.
16.10.2013
MStrasser 342 1 8
Wieso rufst Du nicht Clear() auf Deiner ObservableCollection auf und fügst die Items neu hinzu? Dann musst Du keine neue Instanz erstellen. Ich mach das laufend so. Leider hat ObservableCollection keine AddRange Methode, die kannst Du aber leicht mit einer ExtensionMethod nachrüsten.
ffordermaier 17.10.2013
Ja!! Die Einfachsten Dinge sieht man nicht mehr, wenn man sich einmal in etwas verbissen hat. Werde ich testen unter Berücksichtigung der Geschwindigkeit. Danke
MStrasser 18.10.2013

Stelle deine Binding-Frage jetzt!