Datagrid scrollintoview im viewmodel gesetzt.

  • WPF

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Jeiss.

    Datagrid scrollintoview im viewmodel gesetzt.

    Hallo,
    hab mal wieder ne Frage.....
    In meinem VS2015 Window Projekt hab ich ein Datagrid im Mainwindow welches eine CollectionView als DataContext hat. (also eine ICollectionView Property im ViewModel, so ist das zu verstehen....)
    Im ViewModel kann ich dann den Current Item der Collectionview setzen, scheint gut zu klappen.Aber in meinem Mainwindow scrollt das Datagrid NICHT zu dem "current item" wenn sich dieser ausserhalb des sichtbaren Dagagrid-Bereiches befindet. Dann muss der User (das bin ich..) bis zum current item scrollen. Und den muss ich dann auch noch finden.... ist lästig!Und jetzt frage ich mich ob ich mit der Bindung da irgendwas falsch gemacht habe. Das kann doch kaum das "normale, gewollte" Verhalten eines Datagrids sein... Oder?

    Kennt sich jemand damit aus?
    Hab keine Lust irgend einen komplizierten Code schreiben zu müssen, wenn es auch anders geht....

    Vielen Dank im Voraus,
    Jeiss
    Hallo @Jeiss

    Ich muss dir leider die traurige Nachricht mitteilen das dies doch das "gewollte" Verhalten ist. Der Grund dafür ist performance (vermutlich).
    Die Sache ist die, das die WPF bei diversen Controls mit Virtualisierung arbeitet und somit im View gewisse Datensätze erst gar nicht rendert.
    Sprich: Im Datagrid siehst du zwar am Scrollbalken das viele Datensätze vorhanden sind, diese wurden aber in diesem Moment noch nicht gerendert. Es wird ausgerechnet wieviel Platz die Elemente einnehmen werden und danach der Scrollbalken "gefaked". Beim scrollen werden die Elemente dann "nachgeladen" und Elemente welche nun ausserhalb des Views sind werden Recycled.

    Wenn du nun zu einem Element willst musst du dies explizit sagen. Aber... da sowas rein die View betrifft kann man sowas wie ich finde ruig im View erledigen, das muss nicht in ein ViewModel.
    Kann man natürlich wenn man will mittels AttachedProperty machen, aber wozu.

    Folgendes sollte dir weiterhelfen:

    VB.NET-Quellcode

    1. testGrid.Items.MoveCurrentTo(testGrid.SelectedItem)
    2. testGrid.ScrollIntoView(testGrid.SelectedItem)


    Das könntest du in den Handler von SelectedItemChanged packen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Hallo,
    sorry dass ich mich erst jetzt melde.
    Aber ich hatte mich mal kurz in meinem Projekt "verlaufen"....
    Ich wollte mal den Umweg über ein Behavior probieren. War aber schlussendlich doch zu aufwendig.
    Sowohl die FirstDisplayedScrollingRowIndex propetry von petaod als auch das SelectedItemChanged Event von Sascha scheinen mir keine Windows Elemente zu sein.
    Könnte das sein, dass die eher zum Fonm Datagridview passen?
    Also wie gesagt nach meinem mühsamen Umweg über ein "Scrollintoview" Behabvior, bin ich doch zurück zu einem Datagrid Event gekommen. Und zwar das Selectionchanged Event im Code behind von meinem Mainwindow. Ist wohl ziemlich das gleiche wie das SelectedItemChanged vom DatagridView…..
    Nur schade, dass ich noch keinen Weg gefunden habe um auch den focus, per Code behind, auf die selektierte Datagridrow zu setzen.

    Danke,
    Jeiss
    Sorry, war einfach aus dem Kopf raus geschrieben. Das Event schimpft sich: SelectedCellChanged
    docs.microsoft.com/en-us/dotne…ged?view=netframework-4.8

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##