Nachdem die banale Sortierung eines Datagrids normal keine große Sache sein sollte hier dennoch meine Lösung da es leider defakto nicht so ist. Füllt man nämlich die Daten im Code behind via Itemssource und hat zusätzlich noch eine DataGridTemplateColumn funktioniert die Sortierung nicht! Außer man geht genau so vor wie ich es hier beschreibe:
1. Festlegen der Grideigenschaft CanUserSortColumns auf true 2. Festlegen des SortMemberPathin den Eigenschaften des DataGridTemplateColumn im XAML 3. Setzen der ItemsSource="{Binding}" (Dummy) in den Grideigenschaften (!!!) 4. Füllen des Grids via Datacontext und konvertierung dieser als Liste!!!!
Klingt komisch ist aber so. Hier also als Beispiel:
DataGrid Name="grdLast" AutoGenerateColumns="False" AlternationCount="2" CanUserSortColumns="True" SelectedValuePath="aktivitaets_id" ItemsSource="{Binding}" IsReadOnly="True" SelectionMode="Single" DataGridTemplateColumn Header="Datum" MinWidth="120" SortMemberPath="datum" grdLast.DataContext = (From o In db.xxx).ToList
Szenario: WPF Browseranwendung, festelegen des Owners eines modalen Fensters
Lösung: Festlegen von "window.Owner = Application.Current.MainWindow" -> Funktioniert generell
Allerdings darf dann die WindowStartupLocation NICHT "CenterOwner" sondern "CenterScreen" sein, dann klappts. Klingt komisch ist aber so.
1000 Seiten zu DataGrid Performance, keine hat geholfen. Versuchthabe ich folgende empfohlenen Verbesserung der Eigensdchaften:
VirtualizingPanel.IsVirtualizing="False"
EnableColumnVirtualization="True"
EnableRowVirtualization="True"
ScrollViewer.IsDeferredScrollingEnabled="True"
EnableColumnVirtualization="True"
EnableRowVirtualization="True"
Leider brachte das bei mir nicht den erhofften Erfolg. Folgende Erweiterung des Grids im XAMLbrachte zumindest bei mir den erwünschten Erfolg:
ItemsSource="{Binding RelativeSource={RelativeSource Self}, Path=DataContext,IsAsync=True}"
ScrollViewer.CanContentScroll="False"
Also, das Binding der Itemssource auf Asnychron umstellen und die Eigenschaft CanContentScroll des übergeordneten internen Scollviewers.
TRICK: Itemssource enthält deshalb einen Verweis auf sich selbst, da aufgrund des Sortings im Codebhin die Datacontext Eigenschaft gesetzt wird!
oder: 'Sorting' is not allowed during an AddNew or EditItem transaction tritt auf wenn man die Sortierung eines WPF Datagrids erlaubt hat und den DataContext verändert oder die items.refresh Methode aufruft. Leider hat hier MS wieder nicht reagiert und das Ticket zurückgestellt. Obwohl die WPF Browserapplication dadurch hart beendet wird! Lösung gibt es wieder nur eine weniger schöne udn zwar indem man dem das Datarid mit CommitEdit bzw. CancelEdit zur Beendigung zwingt. In meinem Fall brachte auch nur der Aufruf von beiden (!) Funktionen dien gewünschten Erfolg. Nachteil ist definitiv dass die Sortierung danach verloren geht, aber leider scheint es hier keine schönere Lösung zu geben. In meinem Fall sieht das so aus, da ich den Gridaufbau in einem Thread ausgelegart habe:
Dispatcher.Invoke(New Action(Sub() grdDaten.CommitEdit())) Dispatcher.Invoke(New Action(Sub() grdDaten.CancelEdit()))