La liaison bidirectionnelle dans WPF
Je ne peux pas avoir les deux sens de lier dans WPF pour le travail.
J'ai une propriété de type chaîne de mon application la fenêtre principale qui est lié à une zone de texte (j'ai mis le mode de "communication directe").
La seule fois que la valeur de la zone de texte mise à jour lorsque la fenêtre s'initialise.
Quand je tape dans la zone de texte, le sous-jacent propriétés de la chaîne de valeur ne change pas.
Lorsque la chaîne de valeur de la propriété est modifiée par une source externe (un événement sur Clic, par exemple, qui vient de se réinitialise la zone de texte valeur), le changement n'est pas propager jusqu'à la zone de texte.
Quelles sont les étapes que je doit mettre en œuvre pour obtenir les deux sens de la liaison fonctionne correctement, même dans ce presque banal exemple?
Vous devez vous connecter pour publier un commentaire.
Le plus probablement vous êtes en essayant de se lier à un .net CLR de la propriété au lieu de WPF dependencyProperty (qui fournit la Notification de Changement, en plus de quelques autres choses).
Normal CLR de la propriété, vous devez implémenter INotifyPropertyChanged et forcer la mise à jour sur la zone de texte dans le gestionnaire d'événement pour PropertyChanged.
Cela m'a jeté trop quand j'ai commencé à apprendre à propos de la liaison de données WPF.
Mise à jour: Bien OP, il aurait été une perte de temps si j'étais aboiements le mauvais arbre.. de toute façon maintenant, depuis que vous avez eu à creuser un peu.. vous vous en souviendrez longtemps. Voici l'extrait de code pour compléter cette réponse. Également constaté que la mise à jour de la zone de texte se fait automatiquement dès que je l'onglet sortie.. Vous ne devez manuellement vous inscrire à l'événement et de mettre à jour l'INTERFACE utilisateur si votre datacontext objet n'est pas la seule mise en œuvre de INotifyPropertyChanged.
MyWindow.xaml
MyWindow.xaml.cs
UpdateSourceTrigger=PropertyChanged
dans mon {Binding} définition dans le code xaml avant de travailler.Je ressens le besoin d'ajouter un peu de précision:
"Deux voies" la liaison de données est plus que "d'Une manière" liaison de données.
"One way" données de liaison est une liaison à partir d'une source à une depency de la propriété . La source doit mettre en œuvre INotifyProertyChanged, afin d'obtenir le changement de la propagation de la source à la cible.
Pour obtenir le "2 voies" , de sorte à obtenir une propagation de la Cible à la Source, cela dépend du mode de liaison qui vous définissez sur la Liaison . Si vous ne définissez aucune BindingMode pour votre liaison, la Liaison par défaut en mode sera utilisé, et ce mode par défaut est une des caractéristiques de fo de votre cible de Propriété de Dépendance.
Exemple:
Une zone de texte liée à une propriété de type chaîne, appelée "MyTextProperty".
Dans le code , vous liez zone de texte.Texte DependencyProperty à "MyTextProperty" sur l'objet "Monobjet"
--> "d'une manière" de liaison : le compositeur de "Mon TextProperty" doit déclencher un événement Bien Changé,et "Monobjet" doit implémenter INotifyPropertyChanged.
--> "2 façons de liaison de données": en plus de ce qui est nécessaire pour "One way", bindingMode doit être réglé sur "2 voies". Dans ce cas particulier, le Texte DependencyProperty pour la zone de texte n'ont "2 voies" comme mode par défaut, donc il n'y a rien d'autre à faire !
Nous pourrions avoir besoin de voir le code. Est-ce que votre propriété de chaîne de soulever un événement PropertyChanged? Ou (encore mieux) est-il mis en œuvre comme une DependencyProperty? Si non, la zone de texte liée ne savez pas quand les changements de valeur.
Comme pour la saisie dans la zone de texte et ne pas voir la valeur de la propriété d'un changement, peut-être parce que votre zone de texte n'est pas de perdre le focus. Par défaut, lié zones de texte n'écrivent pas leurs valeurs de retour à la source de la propriété jusqu'à ce qu'il quitte le contrôle. Essayez de tabulation d'elle et de voir si la valeur de la propriété change.
UpdateSourceTrigger
attribut: <TextBox Text="{Binding Foo,UpdateSourceTrigger=PropertyChanged}" />UpdateSourceTrigger=PropertyChanged
fixe mon mal de tête. Peut-être modifier votre réponse à l'inclure?