Dans une application WPF, je crée une fenêtre de configuration pour personnaliser les raccourcis du clavier.
Dans les zones de texte, je gère l'événement clé et convertissez l'événement clé à une forme lisible humaine (ainsi que la forme dans laquelle je veux Pour avoir mes données). p>
La zone de texte est déclarée comme ceci P> et dans le gestionnaire d'événements, j'ai essayé d'utiliser des deux p> < pré> xxx pré> et p> Dans ces deux cas, la reliure retour à la vue ne fonctionne pas, la viewmodel contient toujours les anciennes données et ne se met pas à jour.
La liaison dans l'autre sens (à partir de la vue de la zone de texte) fonctionne bien. P> existe une façon de modifier le code textebox.text à partir du code sans utiliser la liaison?
Ou existe-t-il une erreur ailleurs dans mon processus? P> p>
8 Réponses :
var box = sender as TextBox; // Change your box text.. box.GetBindingExpression(TextBox.TextProperty).UpdateSource(); This should force your binding to update.
Avec l'utilisation de UpdateTarget (), il ne fait aucune mise à jour, même la zone de texte conserve l'ancienne valeur.
Quelques réponses pour exiger encore certaines réflexions. Voyant que vous avez utilisé le même code que j'ai fait, sauf que je n'ai pas ajusté le texte entre .. Je considère que ceci comme la bonne réponse?
Je vous ai donné un +1 depuis que vous êtes le seul qui a aidé.
Idem dans xaml:
Ne changez pas la propriété de texte - Modifiez ce que vous souhaitez. P>
Pourquoi la zone de texte devrait-elle avoir une référence à la vue de la vue elle-même? Je ne veux pas faire de casting sur mon type spécifique, c'est pourquoi j'ai utilisé une liaison bidirectionnelle.
Ça ne devrait pas. Ne vous référez pas à la zone de texte. Quelle que soit la logique que vous devez mettre à jour le texte, il ne devrait pas savoir sur la zone de texte.
Mise à jour d'une propriété ViewModel programmatiquement doit être effectuée dans la vue Idéalement. Idéalement.
Que se passe-t-il si l'utilisateur saisit des données non valides dans la zone de texte qui ne peut pas être écrite dans la vue, le texte de la zone de texte ne peut pas venir de la vue, mais doit être corrigé en premier?
Ceci a fait l'affaire:
private static void SetText(TextBox textBox, string text)
{
textBox.Clear();
textBox.AppendText(text);
textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}
Vous n'avez pas besoin de modifier la valeur de la zone de texte du tout! Dans le code, vous n'avez besoin que de modifier votre valeur associée ( courte -cutanttext em>). > Xxx pré> Vous devez réaliser inotifypropertychanged em> interface dans votre classe, comme décrit dans MSDN: P> http://msdn.microsoft.com/library/system.componentmodel.inotifyPropertychanged.aspx P> Modifier la comptère de votre propriété court-cuttuple em> (sur lequel votre textbox em> est liée à): p> private void TextBox_KeyDown( object sender , KeyEventArgs e )
{
ShortCutText =
( e.KeyboardDevice.IsKeyDown( Key.LeftCtrl )? "Ctrl+ " : "" )
+ e.Key.ToString( );
}
J'ai un cas similaire. P>
Lorsque je effacerai la zone de texte qui perd la reliure. p>
Je portais: Je change pour ceci: Et c'est pointe pour ma solution p> textbox1.text = string.empty code> p>
textbox1.clear () code> p>
Si vous utilisez MVVM, vous ne devez pas modifier la propriété Text de la zone de texte à partir du code, modifiez la valeur dans le modèle de vue et le modèle fera son travail de synchroniser la vue. P>
Vous pouvez le configurer dans le XAML lui-même:
<TextBox Text="{Binding ShortCutText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
Si votre liaison est détruite en définissant une nouvelle valeur (qui est étrange, pour une liaison à deux voies, la liaison doit rester intacte), utilisez-la (((texte) Sender) .SetCurrentValue (textebox.textProperty, newvalue) pour laisser le contraignant intact. p>
Idéalement, vous devez mettre à jour cette valeur dans votre modèle qui reflétera automatiquement les modifications apportées aux zones de texte lorsque vous utilisez MVVM.
Essayez d'ajouter
updatedatesTrigger = Propertychanged code> à votre reliureJe sais que c'est une vieille question d'ici, mais une chose que les gens semblent ignorer ici sont si vous avez une propriété de contrôle liée à un autre contrôle (disons une liste de cases à cocher vérifiées ou non cochées par une case à cocher parent). Il ne peut y avoir rien dans le VM pour vous aider ici.