Als ich meine ersten Versuche mit Databinding in WPF machte (das war glaube ich so kurz vor Beta1), wunderte ich mich eine Zeit lang darüber, warum eine ListBox und ein ContentControl, beide an ein Array gebunden, schon eine funktionierende Master-Detail Ansicht ergaben.
Der Magic Switch war offenbar die Eigentschaft IsSynchronizedWithCurrentItem, die man auf der ListBox auf True setzen muss. Damals gab es noch kaum Dokumentation und ich hatte die grosse Lernklippe noch vor mir.
Das "Geheimnis" verbirgt sich hinter dem Interface ICollectionView. Die CollectionView sitzt zwischen den Controls und der gebundenen Collection (Array, List, DataTable etc). Sie merkt sich, welches Item gerade ausgewählt ist, erlaubt sortieren und gruppieren und reagiert mit dem Werfen von Events wenn Items z.B. hinzugefügt oder gelöscht werden.
Die Eigenschaft IsSynchronizedWithCurrentItem sorgt nun dafür, dass das CurrentItem in der CollectionView immer mit dem Wert synchronisiert wird, den der User in der ListBox ausgewählt hat.
Bindet man z.B. den Content eines ContentControl an eine Collection, so wird dort immer das CurrentItem dargestellt und fertig ist die Master-Detail View.
Einen guten Überblick über die passenden Binding-Expressions gibt es bei Ian Griffith, dessen WPF Buch mir damals eine grosse Hilfe war. [http://www.interact-sw.co.uk/iangblog/2007/09/03/bindtocurrent]
Hier noch ein paar Tips:
- Über die Property Items kann man z.B. an einer ListBox direkt auf die CollectionView zugreifen.
- Wenn man kein Navigieren benötigt, sondern nur eine Liste von Items darstellen will, nimmt man statt ListBox besser ItemsControl.
- Um ein einzelnes Item über ein DataTemplate darzustellen, ist ContentControl eine gute Wahl.
- Unabhängig von irgendwelchen Controls, kommt man per Code meist über CollectionViewSource.GetDefaultView an die passende CollectionView
- Die Default-CollectionView ist Thread-spezifisch, also aufgepasst(!)
Übrigens wird laut Scott Guthrie Silverlight in der Version 1.1 auch DataBinding unterstützen, genau wie das richtige WPF.
Viel Spass,
Florian