2012-12-18 5 views
0

Je suis sûr que je l'ai déjà trouvé cela sur StackOverflow, mais je ne semble pas être assez intelligent pour retrouverWPF MVVM et parent-enfant combobox

Ce que je veux faire (en utilisant WPF MVVM) est la suivante:

cmbSelectedAddressRegion: populated with the list of region 
cmbSelectedAddressCities: populated with the list of cities in that region 

Lorsque l'utilisateur clique sur une région cmbSelectedAddressRegion les éléments cmbSelectedAddressCities devraient être les villes de cette région ne

J'ai un XAML comme celui-ci

<ComboBox Name="cmbSelectedAddressRegion" 
SelectedValue="{Binding Path=selectedAddressItemRegion, UpdateSourceTrigger=PropertyChanged}" 
IsEnabled="{Binding Path=selectedAddressIsEnabled}" 
Style="{StaticResource style_flat_ComboBox}"></ComboBox> 

    <ComboBox Name="cmbSelectedAddressCities" 
SelectedValue="{Binding Path=selectedAddressIdCities, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="id" 
SelectedValuePath="id" 
ItemsSource="{Binding ElementName=cmbSelectedAddressRegion, Path=SelectedItem.Cities}" IsEnabled="{Binding Path=selectedAddressIsEnabled}" 
Style="{StaticResource style_flat_ComboBox}"></ComboBox> 

Lorsque je clique sur une région cmbSelectedAddressRegion les cmbSelectedAddressCities est peuplé correctement

J'ai aussi une machine virtuelle vmCustomer avec beaucoup de DependencyProperties (parmi eux selectedAddressItemRegion et selectedAddressIdCities) Lorsque je sélectionne le client dans la liste principale (un autre combobox dans la fenêtre qui contient la liste des clients) Je vois le cmbSelectedAddressRegion montrant correctement la région, mais je ne vois rien dans le cmbSelectedAddressCities. Encore une fois, si je clique sur le cmbSelectedAddressRegion le cmbSelectedAddressCities est peuplé et les villes (dans le vmCustomer) est sélectionné

Le cmbSelectedAddressRegion.itemssource est limitée (dans bon augure behind) à un ObservableCollection(of vmAddressRegion) Chaque vmAddressRegion actuellement sélectionné a, entre autres DependencyProperties, un cities propriétés qui renvoie un ObservableCollection(of vmAddressCities)

Le ObservableCollection(of vmAddressRegion) est rempli lors de la création de la fenêtre. En même temps, pour chaque élément de ObservableCollection(of vmAddressRegion) (de type vmAddressRegion) la ObservableCollection(of vmAddressCities) est remplie avec les éléments correspondants)

J'espère que je suis assez clair Toute suggestion comment résoudre le problème ci-dessus (le cmbSelectedAddressCities ne pas être "peuplé")?

Merci pour toute aide

+0

y nos ViewModels ne doivent pas avoir DependencyProperties. –

+0

pourquoi? peut-être que j'ai tout faux? J'ai commencé à utiliser MVVM en lisant ici [link] (http://community.visual-basic.it/alessandro/archive/2010/06/15/29563.aspx). – doGmaI

+0

Votre lien est en langue italienne, donc je ne pouvais pas comprendre beaucoup de choses (c'est aussi dans VB qui à ce stade blesse mes yeux juste pour le regarder), mais d'après ce que je vois, il fait 'INotifyPropertyChanged' dans le ViewModels, qui supprime le besoin de DependencyProperties –

Répondre

0

Le ComboBox WPF doit être manipulé avec précaution. Les liaisons sont facilement confuses si ItemsSource et SelectedValue/SelectedItem changent dans le mauvais ordre, surtout si vous utilisez SelectedValue.

Mon conseil serait de remplacer les liaisons "SelectedValue" par "SelectedItem". Les expressions de liaison peuvent rester les mêmes (bien que je ne pense pas que vous deviez spécifier UpdateSourceTrigger).

Reliure à SelectedItem signifie que votre vmCustomer a besoin d'un selectedAddressCity propriété au lieu de l'ID selectedAddressIdCity (et vous pouvez retirer le SelectedValuePath de cmbSelectedAddressCities).

+0

Merci pour votre suggestion Sphinxxx. J'ai déjà fait exactement la même chose (même le nom de la propriété: selectedAddressCity). Après avoir creusé un peu plus, j'ai découvert le vrai problème. C'est un peu compliqué à expliquer et je n'ai pas assez de temps en ce moment (je suis au bureau). Je posterai les détails et la solution plus tard cette semaine (au cas où quelqu'un rencontrerait le même problème). – doGmaI

+0

C'est bon à entendre, et j'ai hâte de voir votre solution! – Sphinxxx

0

Désolé pour le long délai.

Je sais que j'ai promis de poster ma solution à la fin de la semaine, mais mon pc a décidé de mourir le jour suivant. En ce qui concerne mon problème original, j'ai adopté 2 "solutions". D'abord j'ai enlevé l'identification numérique le changeant à la description complète de la région/ville.Je pensais que c'était bon, mais le problème restait toujours pour certains cas "étranges" (par exemple en cliquant la première fois sur la combobox Region.) Après avoir creusé un moment dans le code, j'ai découvert que le vrai problème était dans un convertisseur Au cours d'une conversion, j'ai fait une erreur: au lieu de "if isnothing" J'ai écrit "sinon non" et le résultat était un rien converti en espace, gâcher toute la relation père-enfant était inquiet, le problème était dans mon code, et non dans le morceau de code j'ai posté ici.

je remercie encore une fois tout le monde, et présenter des excuses à nouveau pour le retard