CurrentItem einer ObservableCollection ermitteln/ändern

In letzter Zeit mach ich mehr mit WPF rum. Hierbei spielt ja das MVVM-Pattern eine große Rolle. Darin werden für änderbare Listen oft eine “ObservableCollection” verwendet. Diese informiert alle beteiligten darüber, wenn ein Element gelöscht oder hinzugefügt wurde. Auch unterstützt es dabei das Feature eines “CurrentItems”. Nur konnte ich dieses bisher nie über irgendwelche Methoden aus dem View-Model heraus ansprechen… immer nur durch WPF-Elemente war dies möglich. So hat z.B. eine ListBox das Property “IsSyncronizedWithCurrentItem“. Damit werden Änderungen am “CurrentItem” durch andere Controls (z.B. durch andere ListBoxen) automatisch auch in alle “angeschlossenen” übernommen.
Nur aus meinem ViewModel war es mir noch nicht gelungen das “CurrentItem” zu setzen (z.B. nach Button-Klick), da ich keine Methode oder Property finden könnte.
Jetzt hab ich es endlich gefunden wie man auf das “CurrentItem” zugreift: Man muss sich zuerst die “DefaultView” der Collection holen. Dann kann man auch die Position des aktuelle Items ändern.
z.B. um das “CurrentItem” zu setzen:

var dv = CollectionViewSource.GetDefaultView(viewModel.MeineCollection);
dv.MoveCurrentTo(viewModel.MeineCollection[1]);

oder um das CurrentItem auszulesen:

var dv = CollectionViewSource.GetDefaultView(this.List);
MessageBox.Show(dv.CurrentItem.ToString());

Hier gibt es auch ein kleines Beispielprojekt: WPF_CurrentItem.zip

2 thoughts on “CurrentItem einer ObservableCollection ermitteln/ändern

  1. Jörg Riehn

    Moin,

    bin gerade über Ihren Artikel gestolpert und auch wenn er schon 8 Jahre alt ist, so möchte ich trotzdem kurz darauf eingehen.

    Es ist fachlich falsch zu sagen, dass die ObservableCollection ein CurrentItem hat – hat sie nämlich nicht. Man kann es somit auch nicht ermitteln oder setzen.
    Was Sie dort für zum Setzen und Auslesen des aktuellen Wertes nutzen, ist eine ICollectionView – eine Art Wrapper um eine ObservableCollection (oder andere Liste). An dieser CollectionView orientiert sich das IsSyncronizedWithCurrentItem.

    Auch ist Ihr Beispielprojekt unglücklich, da es dort kein ViewModel gibt. In diesem könnte man z.B. eine Property “SelectedItem” anlegen, die jeweils an die “Selected”-Properties der verschiedensten Controls gebunden wird. Ändert man dann das SelectedItem, wird auch in der Oberfläche die Auswahl geändert.

    Viele Grüße,
    Jörg Riehn

    1. jkalmbach Post author

      Hallo Jörg, Du hast prinzipiell recht. Wenn man aber auf die ObservableCollection bindet, so wird intern auf die DefaultView gebunden und somit gibt es dann doch wieder ein “CurrentItem”
      Grüße Jochen

Comments are closed.