funcry - Mo 17.08.09 21:39
Titel: datagrid ItemSource Object Sortieren
Folgende "Optimierung" will mir einfach nicht gelingen, vielleicht hat jemand eine zündende Idee:
Ausgangssituation ist ein ganz normales DataTable welches ich an ein datagrid binde:
c#:
C#-Quelltext
1:
| this.dataGrid1.ItemsSource = myDataTable.DefaultView; |
In xaml werden die Tabellen-Spalten dann an das Datagrid gebunden:
xaml:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| <my:DataGridTextColumn Header="Symbol" Binding="{Binding Path=Results.Symbol}" IsReadOnly="True" CellStyle="{StaticResource CellStyle}" ElementStyle="{StaticResource TextBlockBottomStyle}" /> |
Klappt auch!
Wie man hier schon sieht, ist das der Versuch meiner kleinen Optimierung. In meinem Datatable packe ich ein Object rein anstelle einzelner Properties. Das erspart mir den ganzen Overhead das vorhandene Object in einzelne Spalten zu zerlegen. Damit trotzdem Daten angezeigt werden, musste ich das Binding ändern. Anstelle von:
C#-Quelltext
1:
| Binding="{Binding Path=Symbol}" |
Wobei Symbol eine Tabellen-Spalte dargestellt hat.
in:
C#-Quelltext
1:
| Binding="{Binding Path=Results.Symbol}" |
Wobei Results ein in dem DataTable gespeichertes Object ist, und Symbol ein Propertie dieses Objektes.
Klappt auch!
Bis auf ein Problem. Das Sortieren funktioniert nicht mehr,
es wird folgende Exception ausgelöst:
Quelltext
1:
| "Der Typ \"\" besitzt keine Eigenschaft mit dem Namen \"Results.Symbol\", weshalb die Datenauflistung nicht sortiert werden kann." |
funcry - Di 18.08.09 16:42
Die Idee das Datagrid an ein Datatable zu binden ist doch eher unpraktisch. Ich haben inzwischen zwei Lösungen gefunden - falls wer vor dem gleichen Problem steht:
Lösung eins:
http://www.scottlogic.co.uk/blog/wpf/2009/04/binding-a-silverlight-datagrid-to-dynamic-data-via-idictionary/comment-page-1/
Diese Lösung ist kompliziert und werde ich nicht nutzen, passt aber genau zu meinem Problem.
Lösung zwei:
Anstelle eines Tables mit Rows welche Objekte darstellen nehme ich einfach eine Collection<myDataType>.
Hier hat prötzlich auch das datagrid kein Problem mehr sauber zu den Properties gebunden zu werden, welche myDataType enthält. Es reicht sogar direkt auf das Property zu binden - daher gibt es auch keine Probleme mit dem Sortieren.
Binding="{Binding Path=Symbol}"
Wobei Symbol ein Property meiner Variablen des Typs myDataType ist.