0
votes

Wpf textbox datailding, fonctionne uniquement partiellement

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: xxx

et dans le main-d'œuvre principal: xxx

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.

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.

txtfeedback.text

"En attente du début du processus ... fait une autre feuille de calcul"

Mise à jour

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


9 commentaires

Pourquoi est-il défini isreadonly = "vrai" ?


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


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 dans votre MainWindow? Comme dans la solution suivante?


@Netcorev oui je fais.


@Anactorro Comment appelez-vous la fonction Fonctionnée ? 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?


3 Réponses :


-1
votes

le faire sans informations sur la liaison bidirectionnelle xxx pré>

modifier + = code> sur = code> p> xxx Pré>

MainWindow: 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";
    }
}


6 commentaires

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 . Egalement stringa + = stringb évalue vers stringa = stringa + stringb . 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é (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é



-1
votes

Supprimer ISReadonly et Binding activé dans modèle à la place. Je pense que cela résout votre problème xxx


1 commentaires

isreadonly n'empêchera que l'entrée de l'utilisateur mais ne modifie pas la modification de textbox.text .



-1
votes

sur les commandes utilisez toujours dépendanceProperty . Puis changez également la liaison (essayez d'éviter de définir le fichier dataContext d'un contrôler sur Ceci ): xxx < P> Également parce que le Textbox est destiné à être affiché uniquement pour utiliser un textblock à la place: xxx

Remarques
Le Binding.mode de la propriété textbox.text est Twoway par défaut. Un en lecture seule ne nécessite pas Twoway 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é}) par exemple. onpropertychangned (mameof (this.feedbacktext); . Cela fera également le refactoring plus facile et sûr.


2 commentaires

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 d'une zone de texte est lutfocus . Link


Oui, tu as raison. La valeur par défaut est perdufocus . Dernier Conseil: Remplacez les littéraux de chaîne par Nomof () E.G. onpropertychanged (nomof (this.feedbacktext) . Ce n'est pas une erreur sujette comme des littéraux de chaîne et facilite le refactoring de code.