2009-11-29 5 views
2

Je fais un certain nombre de codages WinForms pour la première fois et j'essaie d'utiliser des liaisons de données. J'ai une liste que je lie à un tableau de chaînes de mon objet contrôleur et je veux aussi lier l'élément SelectedItem de la liste à une autre propriété de chaîne sur le contrôleur afin que je puisse le suivre.Liaison WinForms ListBox aux propriétés de l'objet

listBox.DataSource = controller.ItemNames; 
listBox.DataBindings.Add(new Binding("SelectedItem", controller, "CurrentItem")); 

Je veux la propriété CurrentItem sur le contrôleur pour être mis à jour dès que l'utilisateur sélectionne différents éléments dans la zone de liste, mais il semble que ce ne soient mis à jour lorsque le focus se déplace vers un autre élément sur le formulaire.

Est-ce le comportement attendu? Est-il possible d'avoir la mise à jour de la liaison SelectedItem immédiatement?

Répondre

8

En général, si vous avez besoin de faire de votre modèle soit immédiatement mis à jour, vous devez utiliser Utilisez DataSourceUpdateMode.OnPropertyChanged comme suggéré dans l'autre poste.

Mais cela ne fonctionne pas pour ListBox.SelectedItem. La raison en est que ListBox n'expose pas l'événement SelectedItemChanged (mais expose SelectedValueChanged et SelectedIndexChanged), donc DataBinding n'a aucune idée que quelque chose a changé dans le contrôle.

Pour contourner ce problème, vous pouvez mettre les lignes suivantes dans le code de configuration de votre commande:

listBox.SelectedIndexChanged += 
    (s, args) => listBox.DataBindings["SelectedItem"].WriteValue(); 
0

Dans le cas général (ValueMember n'est pas spécifié) si vous liez à un objet composite, vous pouvez tirer parti de SelectedValue qui devrait être SelectedItem.

Comme mentionné par AndreyListBox fournit une notification en temps réel pour SelectedValue changements de valeur.

Donc, ce code devrait être suffisant:

listBox.DataBindings.Add("SelectedValue", controller, "CurrentItem", true, DataSourceUpdateMode.OnPropertyChanged); 

Il y a un effet secondaire: la mise en CurrentItem mettra pas à jour le ListBox.

Dans vues maître détail cela devrait être OK: au début il vous suffit de faire en sorte que le SelectedItem (le premier par défaut) est compatible avec le CurrentItem, le flux de travail est entraîné par le maître, le ListBox .

Si cela est un problème alors allez-Andrey solution de.

Questions connexes