2010-02-01 2 views
11

J'ai beaucoup entendu parler des liaisons bidirectionnelles dans WPF, mais je ne comprends pas très bien comment l'accomplir ou ce que cela signifie réellement. Je possède un ListView avec un tas d'articles dedans. Lorsque l'utilisateur sélectionne un nouvel élément, un TextBox dans l'application va changer son texte pour afficher certaines propriétés de l'élément sélectionné.Comment effectuer une liaison de données bidirectionnelle dans WPF?

Mais lorsque l'utilisateur modifie le texte dans la zone de texte, je souhaite que l'élément ListView soit également mis à jour immédiatement. Y a-t-il un moyen magique de WPF de "faire les deux manières" pour accomplir cela?

Répondre

11

Si vous ne l'avez pas vous aurez besoin de mettre en œuvre INotifyPropertyChanged pour votre classe que vous lier à.

En outre, lorsque vous dites que vous voulez que l'élément ListBox soit mis à jour immédiatement, vous voulez dire que vous voulez qu'il change au fur et à mesure que vous tapez TextBox. Par défaut, la propriété TextBox.Text met à jour sa source quand il perd le focus, mais vous pouvez changer cela en définissant la liaison UpdateSourceTrigger à PropertyChanged:

{Binding Source={...}, Path=Whatever, UpdateSourceTrigger=PropertyChanged} 
+3

En fonction de la façon dont il a configuré les éléments, il se peut que Source doive être remplacé par ElementName (avec un chemin de SelectedItem.Whatever) ou, si l'ensemble d'éléments liés est DataContext, être omis, mais dans ce dernier cas le ListView aura besoin de IsSynchronizedWithCurrentItem = "True". – itowlson

+0

C'est comme dit itowlson. Merci beaucoup! –

+0

Ahh vrai, et merci de corriger la syntaxe;) –

1

Quel est le type des éléments dans ListView? Pour obtenir les deux voies de liaison allant de la nécessité de mettre en œuvre INotifyPropertyChanged ...

Cela pourrait aider WPF event property changed?

+0

Les éléments de la vue en liste sont des objets qui implémentent 'INotifyPropertyChanged'. –

+0

Avez-vous un échantillon de ce à quoi ressemble votre code? – anthonyv

33

Mark's answer montre comment accomplir ce que vous voulez, mais vous avez aussi demandé plus généralement " comment accomplir [liaison à double sens] et ce que cela signifie réellement. " Une liaison unilatérale signifie que la cible de liaison (par exemple, le contrôle) affichera des données provenant de la source de liaison (par exemple objet métier) et se mettra à jour en même temps que l'objet métier, mais les modifications apportées au contrôle ne seront pas propagées Retour à l'objet métier. Par exemple. si le nom Person.Name change de "bob" à "kate", TextBlock.Text lié au nom changera de "bob" à "kate" aussi. La liaison bidirectionnelle signifie simplement que non seulement les modifications de l'objet métier sont répercutées dans l'interface utilisateur, mais que les modifications apportées par l'utilisateur dans l'interface utilisateur sont également propagées à l'objet métier. Donc maintenant, quand l'utilisateur édite le TextBox.Text lié au Name, par exemple en changeant "kate" en "edmund", WPF va aussi mettre la propriété Person.Name à "edmund".

Pour ce faire, définissez simplement Mode = TwoWay dans la déclaration de liaison. Par défaut, certaines propriétés se lient dans les deux sens: TextBox.Text, par exemple, lie TwoWay par défaut, ce qui explique pourquoi le code de Mark n'a pas besoin de la déclaration Mode. En outre, comme le note Mark, par défaut, WPF propage uniquement les modifications à l'objet métier lorsque le contrôle perd le focus. Si vous avez deux éléments d'interface utilisateur liés à la même propriété, cela peut signifier qu'ils apparaissent désynchronisés, auquel cas vous pouvez utiliser UpdateSourceTrigger pour forcer WPF à se propager chaque fois que la propriété change. MSDN couvre cela en détail avec quelques bons diagrammes clairs: voir Data Binding Overview dans le SDK WPF.

+1

Belle vue d'ensemble de la reliure. =) –

+0

Up voté. Je suis passé par une tonne de résultats de recherche qui ont tous décrit comment implémenter la liaison de données bidirectionnelle, mais aucun qui a expliqué le concept. Votre message a fait et très succinctement. –

+0

Merci pour cela, en particulier l'instruction "Certaines propriétés se lier dans les deux sens par défaut: TextBox.Text, par exemple, lie TwoWay par défaut" Cela a énormément aidé :) – sergeantKK

Questions connexes