Question

J'essaie d'effectuer une propriété de validation.Nous avons une propriété nullable appelée :

public int? Number 
{ 
    get { return _number; } 
    set 
    { 
        if (_number != value) 
        { 
            _number = value; 
            RaisePropertyChanged("Number"); 
        } 
    } 
} 

Et cette propriété est liée à une zone de texte.Je veux seulement valider ces deux scénarios :

  • Imaginez que l'utilisateur ait laissé la zone de texte vide (textbox.text=""), donc la propriété Number doit recevoir une valeur nulle (au lieu de "" ).
  • Et si l'utilisateur saisit "2b", la propriété Number doit avoir une valeur nulle (car c'est une erreur), mais la zone de texte doit toujours indiquer "2b".

La mise en œuvre pour cela est donc :

public class IntConverter : IValueConverter
{
    private static readonly IntConverter defaultInstance = new IntConverter();

    public static IntConverter Default { get { return defaultInstance; } }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is int?)
        {
            int? intValue = (int?)value;
            if (intValue.HasValue)
            {
                return intValue.Value.ToString();
            }
        }

        return Binding.DoNothing; 
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is string)
        {
            int number;
            if (Int32.TryParse((string)value, out number))
            {
                return number;
            }
        }

        return null;
    }
}

Le code ci-dessus fonctionne vraiment, mais une seule chose ne fonctionne pas bien.Lorsque l'utilisateur saisit "2b", à ce moment, l'erreur doit être affichée (bordure rouge).Comment puis-je le réparer ?

NOTE:Les propriétés de validation sont vraies.

    <TextBox Text="{Binding Number, UpdateSourceTrigger=PropertyChanged,
        ValidatesOnExceptions=True, ValidatesOnDataErrors=True, NotifyOnValidationError=True, TargetNullValue={x:Static sys:String.Empty},
        Converter={x:Static c:IntConverter.Default}}" />
Était-ce utile?

La solution

Implémentez le interface IDATAERRORINFO dans votre modèle de vueclasse au lieu d'utiliser la classe nullableIntValidation.

Il y a un bel exemple Ici .

Autres conseils

Pourquoi avez-vous besoin d'un convertisseur pour cela, la liaison WPF est suffisamment puissante pour gérer ce cas.

  • Tout d’abord, si vous liez le textBox avec int ?et que vous essayez de définir la chaîne dessus (2b), elle affichera automatiquement une bordure d'erreur de validation rouge autour d'elle.

  • Deuxièmement, si vous souhaitez définir la valeur nulle en cas de chaîne vide, il vous suffit de définir la valeur TargetNullValue pour votre reliure.

Cet exemple de code fonctionnera pour vous -

<TextBox Text="{Binding Number, TargetNullValue={x:Static s:String.Empty},
                 UpdateSourceTrigger=PropertyChanged}"/>

Assurez-vous d'ajouter l'espace de noms du système d'espace de noms à votre xaml -

xmlns:s="clr-namespace:System;assembly=mscorlib"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top