J'ai une zone de texte simple WPF que je souhaite mettre à jour une fois lorsque la fenêtre est initialisée, puis chaque fois qu'un certain événement se produit. J'ai suivi les instructions de nombreuses réponses Stackoverflow, en particulier celle-ci: WPF: Reliure de données de texte simple Donc je suis venu avec ce qui suit.
in xaml: p> et dans le main-d'œuvre principal: p> quand Le constructeur du formulaire est appelé, la zone de texte affiche correctement "en attente de début du processus ...", mais lorsque j'appelle la méthode de la feuille de finition (qui est appelée par un autre événement), la zone de texte n'est pas mise à jour. P> Veuillez noter que si je mettez des points d'arrêt à l'intérieur de l'onpropertychanged, je peux voir que cela s'appelle, et dans la fenêtre immédiate, je peux voir la propriété de texte en train de changer, mais la zone de texte n'est pas mise à jour. P> txtfeedback.text p>
"En attente du début du processus ... fait une autre feuille de calcul" p>
blockQuote> Le problème était beaucoup plus simple et désolé pour tout le monde pour ne pas afficher une partie fondamentale du code: Je faisais tout à l'intérieur du fil de l'interface graphique! forte >
Donc, bien sûr, l'interface graphique n'a pas pu réagir avant que je publie le fil!
Une fois que j'ai fait l'appel externe asynchrone, tout fonctionne bien.
Merci à tous pour vos suggestions cependant, j'ai beaucoup appris et j'espère que les autres l'ont fait aussi. P> p>
Mise à jour h1>
3 Réponses :
le faire sans informations sur la liaison bidirectionnelle modifier MainWindow: P> + = code> sur
= code> p>
public partial class MainWindow : Window, INotifyPropertyChanged
{
private string _feedbackText;
public event PropertyChangedEventHandler PropertyChanged;
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
FeedbackText = "Awaiting start of process...";
}
public string FeedbackText
{
get
{
return _feedbackText;
}
set
{
_feedbackText = value;
OnPropertyChanged("FeedbackText");
}
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void FinishedWorksheet(object sender, EventArgs e)
{
FeedbackText = "Done another worksheet";
}
}
Je crains que cela ne se produise pas. C'est toujours une chance manquée d'apprendre des torts.
Mon point est que les contrôles doivent utiliser dépendanceProperty code>. Egalement
stringa + = stringb code> évalue vers
stringa = stringa + stringb code>. Donc, il n'y a pas de différence. La propriété sera définie dans les deux sens.
La dépendanceProperty est un complément qui peut être utilisé pour certaines raisons. Il présente plusieurs avantages mais ce n'est pas toujours nécessaire. Dans ce cas, ma tâche est une exagération et d'autre part, elle n'aura pas d'impact sur l'action dans cette situation.
Lorsque nous utilisons ViewModel pour lier des données à nos commandes, nous n'avons pas besoin d'utiliser des propriétés de dépendance. Mais, nous essayons de lier les contrôles aux valeurs du code derrière, de sorte qu'il ne peut donc pas fonctionner sans propriété de dépendance.
@Linam la solution fonctionne pour moi avec succès. Je n'ai pas besoin d'utiliser dépend de lapropriété code> (comme indiqué dans une autre réponse) pour qu'il fonctionne
@Lingam MVVM doit être utilisé dans ce cas. Le fait qu'il ne soit pas fait parce qu'il n'a aucun sens ne change pas le fait que cela fonctionne comme j'ai ajouté
Supprimer ISReadonly Code> et Binding
activé code> dans
modèle code> à la place. Je pense que cela résout votre problème
isreadonly code> n'empêchera que l'entrée de l'utilisateur mais ne modifie pas la modification de
textbox.text code>.
sur les commandes utilisez toujours dépendanceProperty code>. Puis changez également la liaison (essayez d'éviter de définir le fichier
dataContext code> d'un
contrôler code> sur
Ceci code>):
Textbox CODE> est destiné à être affiché uniquement pour utiliser un
textblock code> à la place: p>
Le Binding.mode code> de la propriété
textbox.text code> est
Twoway code> par défaut. Un
en lecture seule code> ne nécessite pas
Twoway code> Liaison du tout puisqu'il ne peut pas recevoir d'entrée.
Évitez toujours toujours les littéraux de chaîne. Utilisez plutôt nomof ({propriété}) code> par exemple.
onpropertychangned (mameof (this.feedbacktext); code>. Cela fera également le refactoring plus facile et sûr. P> P>
Merci @BionicCode, j'essaie de mettre en œuvre votre code et je vous ferai savoir comment ça se passe. Juste en ce qui concerne vos remarques, je pense que la valeur par défaut pour updateSourcetrigger code> d'une zone de texte est
lutfocus code>. Link
Oui, tu as raison. La valeur par défaut est perdufocus code>. Dernier Conseil: Remplacez les littéraux de chaîne par
Nomof () CODE> E.G.
onpropertychanged (nomof (this.feedbacktext) code>. Ce n'est pas une erreur sujette comme des littéraux de chaîne et facilite le refactoring de code.
Pourquoi est-il défini
isreadonly = "vrai" code>?
Je veux que cela ne soit utilisé que pour les commentaires: l'utilisateur ne doit pas être capable de le changer. J'ai essayé de le retirer mais ça ne fait pas une différence
Cela pourrait être une question multithreading. Quel événement est ce gestionnaire? Essayez d'envoyer l'appel à l'intérieur du gestionnaire d'événements:
Dispatcher.invoke (() => {...}); code>
C'est un moyen très étrange de mettre à jour votre vue. InotifyPropertyChanged est généralement implémentée dans un modèle de vue, pas de code derrière. Si vous êtes dans le code derrière vous, vous pouvez simplement mettre à jour la zone de texte directement.
@GaztheDestroyer Oui Je suis nouveau à WPF et j'ai réalisé que la bonne façon de le faire consiste à utiliser un modèle de vue. Pourtant, en ce qui concerne votre point de mettre à jour directement la zone de texte directement, j'ai été initialement, mais le changement n'était pas affiché, c'est pourquoi je suis entré dans tout ce désordre.
@Anactorro Avez-vous
Public Partial Classe MainWindow: Fenêtre, inotifyPropertyChanged code> dans votre MainWindow? Comme dans la solution suivante?
@Netcorev oui je fais.
@Anactorro Comment appelez-vous la fonction
Fonctionnée code>? Montrer comment ça regarde dans xaml
@Anaporro Si votre zone de texte ne met pas la mise à jour lorsque vous définissez le texte de contrôle directement à partir du code derrière, vous avez un problème plus fondamental et tout ce type de liaison est un hareng rouge. Avez-vous essayé une zone de texte non réadonnée? Définissez-vous le texte de contrôle directement ailleurs? (qui détruirait également votre BTT BTW). Y a-t-il plus d'une zone de texte?