Bug in WPF combobox databinding
Vorige week ondervonden we problemen met de databinding van de WPF combobox. Een van de formulieren die we aan het ontwikkelen waren bestond uit een master-detail-view. De master werd geselecteerd in een listview, die verbonden was met een lijst van contactpersonen viewmodels. Bij het selecteren van een item in de lijst veranderde de databinding in het detailformulier naar het viewmodel van de geselecteerde contactpersoon. Op dit formulier was een combobox waarvan de items verbonden waren met een lijst van landen en het geselecteerde item met het land van de contactpersoon.
<ComboBox SelectedItem="{Binding SelectedCountry}"
ItemsSource="{Binding Countries, Mode=OneWay}"
DisplayMemberPath="Name">
</ComboBox>
De bug die we ondervonden was bij het selecteren van een contactpersoon in de lijst, veranderde de databinding van het detailformulier naar het juiste viewmodel van de geselecteerde contactpersoon. Echter, bij het overschakelen naar een andere contactpersoon en vervolgens weer terugkeren naar de oorspronkelijke contactpersoon, was het geselecteerde land altijd op null gezet en was daardoor het land van de contactpersoon verloren.
Omdat we niet wisten waar te beginnen, maakten we een klein testproject om het probleem te debuggen. Hierdoor ontdekten we dat de combobox nog steeds een referentie had naar het vorige viewmodel en daardoor het land op null zette.
Uiteindelijk hadden we een ingeving en schakelden we de ItemSource en SelectedItem om in de combobox XAML. Hierdoor werd het probleem opgelost.
<ComboBox ItemsSource="{Binding Countries, Mode=OneWay}"
SelectedItem="{Binding SelectedCountry}"
DisplayMemberPath="Name"> </ComboBox>
En tadaaa ... alles werkte zoals het moest!
We hebben geen idee waarom het op deze manier wel werkt, een WPF bug waarschijnlijk. Donwload hieronder het test project dat het probleem reproduceert en oplost.