DataGrid + CollectionViewSource

  • WPF MVVM
  • .NET 7–8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    DataGrid + CollectionViewSource

    Hallo,

    ich beschäftige mich gerade mit dem Designer eines DataGrid. Was das angeht bin ich auch noch gar nicht weit, habe allerdings schon die erste Frage.

    Erstmal habe ich mich um den Umgang mit der CollectionViewSource gekümmert bzw. ICollectionView (momentan verstehe ich das synonym, denn alles was ich nutze ist ICollectionView, aber gesprochen wird an jeder Stelle wo ich mich informiert habe von CollectionViewSource)

    Dabei habe ich die Variante 1 gesehen, die funktioniert auch, aber so wie ich GetDefaultView und den Umang der WPF mit Collections verstanden habe, habe ich auch Variante 2 probiert und das geht auch. Ich finden Variante 2 intuitiver.
    Also einmal wird explizit an den ICollectionView gebunden und einmal an die Collection, wobei daja automatisch an denselben ICollectionView gebunden wird. Ist das korrekt?

    Variante 1: Binding an cvProdukte

    VB.NET-Quellcode

    1. Public NotInheritable Class Data
    2. ...
    3. Public ReadOnly Property cvProdukte As ICollectionView
    4. Private ReadOnly _Produkte As ObservableCollection(Of Produkt)
    5. Private Sub New()
    6. ...
    7. _cvProdukte = CollectionViewSource.GetDefaultView(_Produkte)
    8. End Sub
    9. Private Sub GroupTest
    10. _cvProdukte.GroupDescriptions.Add(New PropertyGroupDescription(NameOf(Produkt.Bezeichnung)))
    11. End Sub
    12. End Class


    Variante 2: Binding an Produkte

    VB.NET-Quellcode

    1. Public NotInheritable Class Data
    2. ...
    3. Private ReadOnly _cvProdukte As ICollectionView
    4. Public ReadOnly Property Produkte As ObservableCollection(Of Produkt)
    5. Private Sub New()
    6. ...
    7. _cvProdukte = CollectionViewSource.GetDefaultView(_Produkte)
    8. End Sub
    9. Private Sub GroupTest
    10. _cvProdukte.GroupDescriptions.Add(New PropertyGroupDescription(NameOf(Produkt.Bezeichnung)))
    11. End Sub
    12. End Class


    Viele Grüße
    Mach mal beides, also die ICV und OC zu Properties. ICV = CollectionViewSource.GetDefaultView(_Produkte), dann diese ICV binden. Wobei ich die ICV als ReadOnly habe, also einen private setter, im getter dann den Returnwert con GetDefaultView rausgebe.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    jo, Variante2 dürfte nicht funktionieren. Es muss immer an ein ICollectionView (oder konkrete Implementation davon) gebunden sein.
    Ansonsten gehen nützliche Events verloren: CurrentChanging, CurrentChanged

    Zu Variante1: Ja, man sieht überall die CollectionViewSource, aber wozu die eiglich gut ist, hat sich mir noch nicht erhellt.
    Ich mache es mir noch einfacher, und sogar winzbischen leistungsfähiger: Ich stelle statt der abstrakten ICollectionView eine konkrete ListCollectionView dem Binding zur Verfügung, mit New erzeugt.
    CollectionViewSource? - keine Ahnung wozu gut.
    @DTF
    Das ist doch die Variante 1 nur dass ich die OC da nicht als Public Property habe, aber wozu auch.
    Möchtest du Beispieldaten? Dann kannst du es vielleicht selbst anschauen.

    ErfinderDesRades schrieb:

    Ansonsten gehen nützliche Events verloren: CurrentChanging, CurrentChanged
    Woran könnte ich das sehen?

    Die Sache ist, ich habe es so verstanden, dass auch wenn man an ObservableCollection bindet, WPF verwendet immer eine ICollectionView. Und diese kann man mit GetDefaultView ansprechen. Da direkt dran zu binden sollte also außer meine Sicht Funktionalität verlieren statt gewinnen, welche hätte ich aber auch keine Ahnung.
    Quasi wie in WinForms typDataTable = ObservableCollection, ICollectionView = BindingSource, Window = DataGridView
    Da macht es dann vielleicht doch Sinn, da nimmt man selbst dann ja die BindingSource her.

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Haudruferzappeltnoch schrieb:

    Woran
    könnte ich das sehen?
    Die alte Leier: VisualStudio richtig nutzen (Google ist nicht deine Mami)

    Haudruferzappeltnoch schrieb:


    Quasi wie in WinForms typDataTable = ObservableCollection, ICollectionView = BindingSource, Window = DataGridView
    die richtige Spur, aber seeehr salopp formuliert.
    Genauer:
    • In WinForms steuert man per BindingSource Filtern, Sortieren, Currency-Management
    • In Wpf steuert man per ICollectionView Filtern, Sortieren, Currency-Management, sowie Grouping
      ICollectionView ist ein Interface, es gibt also mehrere Implementationen davon. DesignTime-Preview-Support bietet soweit ich bislang weiss aber nur ListCollectionView.
      Currency-Management (d.h: welches Item ist das aktuell angewählte?) kann man auch über eine bindebare Extra-Property bewerkstelligen. Das machen sehr viele Leuts, weil sie's halt nicht besser wissen.