Problème de liaison avec WPF 2 ComboBox
-
03-07-2019 - |
Question
J'ai le problème suivant:
il y a une classe avec quelques propriétés de chaîne
il existe une collection de telles entités de classe
Cette collection apparaît dans l’arborescence à gauche de certaines fenêtres et les détails à droite. Je lie les propriétés de chaîne du nœud sélectionné aux listes déroulantes de manière détaillée.
La première liste déroulante a toujours le même élément Source, mais la seconde, élémentSource, dépend de SelectedItem de la première liste déroulante ...
<ComboBox
Grid.Column="1"
SelectedIndex="0"
x:Name="cbClass"
Style="{DynamicResource ComboBoxValidationError}"
SelectedValue="{Binding Path=Description.Node.ClassName, ElementName=userControl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Source={StaticResource classesProvider}}"
Width="Auto"
Height="Auto"
DisplayMemberPath="Description"
SelectedValuePath="FQN" />
<ComboBox
Grid.Column="1"
SelectedIndex="0"
Grid.Row="1"
x:Name="cbMethod"
SelectedValue="{Binding Path=Description.Node.MethodName, ElementName=userControl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,diag:PresentationTraceSources.TraceLevel=High}"
ItemsSource="{Binding Path=SelectedItem.Methods, ElementName=cbClass, Mode=Default,diag:PresentationTraceSources.TraceLevel=High}"
Style="{DynamicResource ComboBoxValidationError}"
Width="Auto"
Height="Auto"
SelectedValuePath="Name"
DisplayMemberPath="Description" />
Maintenant, lorsque je crée un nouveau noeud dans l'arborescence, les deux propriétés de chaîne ont une référence nulle. Et lorsque la première combinaison modifie son SelectedItem pour le nœud NEW, la deuxième ComboBox lie null à la valeur de chaîne du nœud OLD, qui ont été sélectionnées avant la création d'un nouveau nœud dans l'arborescence ... Je me demande ce que je dois faire dans ce cas?
La solution
Je viens de trouver une réponse.
Les liaisons sont notifiées dans l'ordre de leur déclaration, WPF ne va pas analyser les dépendances des liaisons :)
Donc, échanger les déclarations de ComboBox résout le problème ... C'est acceptable dans ce scénario car je place ces ComboBox dans Grid en définissant manuellement leurs propriétés Grid.Row et Grid.Column ...
Bien que la solution ne soit pas très agréable, cela fonctionne!