8
votes

Comment changer S textebox.text sans perdre la liaison dans WPF?

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).

La zone de texte est déclarée comme ceci xxx

et dans le gestionnaire d'événements, j'ai essayé d'utiliser des deux < pré> xxx

et xxx

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.

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?


3 commentaires

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 à votre reliure


Je 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.


8 Réponses :


10
votes
var box = sender as TextBox;
// Change your box text..

box.GetBindingExpression(TextBox.TextProperty).UpdateSource();
This should force your binding to update.

4 commentaires

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:



3
votes

Ne changez pas la propriété de texte - Modifiez ce que vous souhaitez.


4 commentaires

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?



1
votes

Ceci a fait l'affaire:

private static void SetText(TextBox textBox, string text)
    {
        textBox.Clear();
        textBox.AppendText(text);
        textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }


0 commentaires

1
votes

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( );
}


0 commentaires

1
votes

J'ai un cas similaire.

Lorsque je effacerai la zone de texte qui perd la reliure.

Je portais: textbox1.text = string.empty

Je change pour ceci: textbox1.clear ()

Et c'est pointe pour ma solution


0 commentaires

0
votes

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.


0 commentaires

0
votes

Vous pouvez le configurer dans le XAML lui-même:

<TextBox Text="{Binding ShortCutText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>


0 commentaires

1
votes

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.


0 commentaires