12
votes

Validation de la zone de texte WPF

J'ai une validation accrochée à un modèle lié au conteneur de texte . Lorsque la fenêtre est d'abord ouverte, les erreurs de validation apparaissent comme le modèle est vide, je ne veux pas voir des erreurs de validation tant que de la fenêtre de la fenêtre ou du texte dans la zone de texte a changé ou sur la mise au point perdue.

Voici la zone de texte : xxx

Comment cela peut-il être atteint?


0 commentaires

4 Réponses :


-1
votes

Ce que je fais, je n'en ai pas si c'est la bonne façon (je serais heureux d'apprendre, c'est une chance), mais dans l'initialisateur de l'entité ou le modèle, je gère tous les validateurs.


0 commentaires

7
votes

Si vous mettez en œuvre IDATAERRORINFO, je l'ai atteint en vérifiant les valeurs nulles dans la mise en œuvre de la logique de validation. Lors de la création d'une nouvelle fenêtre, la vérification de NULL empêchera votre logique de validation de la cuisson. Par exemple: xxx pré>

De plus, si vous souhaitez déclencher la validation sur textbox.lostfocus, modifiez votre liaison à LostFocus, comme suit: p>

<TextBox Text="{Binding              
               Path=Firstname,              
               UpdateSourceTrigger=LostFocus,              
               ValidatesOnDataErrors=True}"             
     Width="124"             
     Height="24"/>


2 commentaires

Il pourrait être valable que certains des champs soient nuls, ce qui se passe dans ce cas?


Si NULL est une entrée valide, la validation ne retournera pas une erreur si vous le dites de ne pas. Tout dépend de la manière dont vous appliquez votre logique commerciale. Par exemple, si le champ peut être nul ou vide, permettez simplement à ces exceptions à effectuer dans votre logique. Pouvez-vous nous donner un exemple de ce que vous voulez vérifier sur un domaine particulier?



22
votes

Cela dépend vraiment de votre mise en œuvre d'IDATAERRORINFO. Si vous le basez autour d'un dictionnaire de messages d'erreur, vous pouvez contrôler lorsque la validation est exécutée qui ajoute à cette liste. Vous voudrez normalement le faire à partir de vos constructeurs de propriétés (comme chaque fois que vous appelez de biensChanger), appelez ici CheckValidationState: xxx pré>

Vous pouvez également inclure une méthode qui valide toutes vos propriétés (comme pendant Une sauvegarde): p> xxx pré>

mise à jour: p>

Je vous recommanderais de mettre le code ci-dessus dans une classe de vue de la base afin que vous puissiez la réutiliser. Vous pouvez ensuite créer une classe dérivée comme celle-ci: p>

public class SampleViewModel : ViewModelBase
{
    private string _firstName;

    public SampleViewModel()
    {
        Save = new DelegateCommand<object>(SaveExecuted);
    }

    public DelegateCommand<object> Save { get; private set; }

    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (_firstName == value)
                return;

            CheckValidationState("FirstName", value);

            _firstName = value;
            NotifyPropertyChanged("FirstName");
        }
    }

    public void SaveExecuted(object obj)
    {
        bool isValid = Validate();
        MessageBox.Show(isValid ? "Saved" : "Validation Error. Save canceled"); // TODO: do something appropriate to your app here
    }

    protected override bool CheckValidationState<T>(string propertyName, T proposedValue)
    {
        // your validation logic here
        if (propertyName == "FirstName")
        {
            if (String.IsNullOrEmpty(proposedValue as String))
            {
                SetError(propertyName, "First Name is required.");
                return false;
            }
            else if (proposedValue.Equals("John"))
            {
                SetError(propertyName, "\"John\" is not an allowed name.");
                return false;
            }
            else
            {
                SetError(propertyName, String.Empty); // clear the error
                return true;
            }
        }
        return true;
    }
}


4 commentaires

Merci pour la réponse John, pourriez-vous développer votre réponse un peu s'il vous plaît. J'ai essayé de mettre en œuvre ce que vous avez discuté et obtenu un peu perdu. Merci...


Burt - j'ai mis à jour pour ajouter plus de code pour montrer comment une classe pourrait implémenter cela que j'espère remplir dans certains des trous pour vous. Est-ce que cela vous aide?


Merci John apprécie vraiment cela, je suis allé à vous voter, mais vous avez réussi à supprimer un vote, cela ne m'a pas laissé ajouter.


@Johnbowen pourquoi notifypropertychanged ("erreurs"); Notifypropertychanged ("erreur"); NotifypropertyChanged ("Item []"); tiré à seterror?



4
votes

Dans votre fichier App.xaml, vous devez utiliser un style de texte personnalisé pour la validation de la zone de texte sans composant tiers.

Entrez la description de l'image ici xxx


0 commentaires