6
votes

WPF Textbox La valeur ne change pas sur ONPROPERTYCHANGED

J'ai une zone de texte dont la valeur est liée à une propriété ViewModel:

    private int _runAfter = 0;
    public string RunAfter
    {
        get
        {
            return _runAfter.ToString();
        }

        set
        {
            int val = int.Parse(value);

            if (_runAfter != val)
            {
                if (val < _order)
                    _runAfter = val;
                else
                {
                    _runAfter = 0;
                    OnPropertyChanged("RunAfter");
                }
            }
        }
    }


0 commentaires

3 Réponses :


3
votes

Quelques choses que j'ai remarquées ici.

Sauf si vous avez une raison convaincante d'exposer la propriété matricielle comme une chaîne, il n'y a aucune raison pour que cela ne puisse pas être un int. Qui vous ferait économiser la distribution dans le setter (ainsi qu'une caduque éventuelle InvalidCastException si l'utilisateur entre quelque chose de non-entier dans le champ).

Deuxièmement, l'appel surpropertychanged () devrait se produire à l'extérieur de l'intérieur. Si la déclaration, comme ce qui suit: xxx

puisque la locale _Runafter est mise à jour dans les deux chemins du conditionnel, l'onpropertychanged () doit être appelée quelle que soit la branche prise. J'espère que cela vous aidera à vous diriger dans la bonne direction!


3 commentaires

+1 Pour noter que vous devez déplacer l'ONPROPERTYCHANGED à l'extérieur de l'autre.


Eh bien, l'ensemble est appelé par la vue (via une liaison), donc je pensais qu'il ne serait nécessaire que d'appeler surpropertychangned si la valeur serait changée de celle qui est réglée dans la vue.


Indépendamment de la manière dont le setter est appelé, tout changement doit soulever l'événement de l'état de propriété pour laisser les auditeurs sachez qu'ils doivent actualiser leur valeur. Avez-vous examiné d'utiliser ValidationRules pour effectuer une validation plutôt que de l'intégrer dans votre code de réglage? msdn.microsoft.com/en-us/Library/ ...



6
votes

Le problème est que vous mettez à jour la source de la reliure code> tandis que la liaison code> code> met à jour votre propriété. WPF ne vérifiera pas la valeur de votre propriété lorsqu'elle soulève l'événement CODE> COPECTCHANGED CODE> en réponse à un Binding code> mise à jour. Vous pouvez résoudre ce problème en utilisant le Dispatcher code> pour retarder la propagation de l'événement dans cette branche: xxx pré>

update: strong> p>

L'autre chose que j'ai remarquée, c'est que le la liaison code> sur votre est à l'aide de la valeur par défaut mises à mises à jour code>, ce qui se produit lorsque la zone de texte code> perd la mise au point. Vous ne verrez pas le texte de retour sur 0 jusqu'à après que la zone code> code> perd la mise au point avec ce mode. Si vous le modifiez en Propertychanged code>, vous le verrez immédiatement. Sinon, votre propriété ne sera pas définie tant que votre Textbox code> perd la mise au point: P>

<TextBox Name="txtRunAfter" Grid.Column="4" Text="{Binding RunAfter, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource TestStepTextBox}"/>


2 commentaires

Je suppose que votre évaluation du problème est correcte, mais l'appel du répartiteur ne fonctionne pas. Mon UserControl est utilisé dans une application WinForm à l'aide d'un elehost. Peut-il affecter l'appel du répartiteur?


D'accord, j'ai testé cela et cela a bien fonctionné (lorsque vous avez l'air libre de la zone de texte car le mode par défaut de la liaison ne mettra pas à jour la propriété tant que la zone de texte perd la mise au point). J'ai mis à jour la réponse à expliquer sur les mises à jourOrigger sur les liaisons, au cas où le comportement que vous voyez. Je ne traite pas beaucoup avec WPF hébergé dans Winforms, mais je ne vois pas pourquoi cela affecterait la liaison ou le répartiteur dans votre contexte.



1
votes

J'ai eu la même situation. J'ai écrit ce qui suit et cela fonctionnait.

et xxx


0 commentaires