2

検証プロパティを実行しようとしています。次のような null 許容プロパティがあります。

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

そして、このプロパティはテキストボックスにバインドされています。この2つのシナリオのみを検証したい:

  • ユーザーがテキスト ボックスを空のままにしたとします (textbox.text="")。したがって、 Number プロパティは null 値を受け取る必要があります (代わりに "" )。
  • また、ユーザーが「2b」と入力した場合、Number プロパティには null 値が含まれている必要がありますが (エラーであるため)、テキスト ボックスには「2b」と表示されている必要があります。

したがって、これの実装は次のとおりです。

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;
    }
}

上記のコードは実際に機能していますが、うまくいかないことが 1 つあります。ユーザーが「2b」と入力すると、この時点でエラー (赤い境界線) が表示されます。どうすれば修正できますか?

注: Validations プロパティは true です。

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

2 に答える 2

2

NullableIntValidation クラスを使用する代わりに、ビュー モデル クラスにIDataErrorInfoインターフェイスを実装します。

ここに良い例があります。

于 2012-01-26T04:22:02.830 に答える
2

なぜこれにコンバーターが必要なのですか?WPF バインディングはこのケースを処理するのに十分強力です。

  • まず、textBox を int でバインドする場合は?値に文字列を設定しようとすると (2b)、その周囲に赤い検証エラーの境界線が自動的に表示されます。

  • 次に、空の文字列の場合に null 値を設定する場合はTargetNullValue、バインディングに設定する必要があります。

このコードサンプルはあなたのために働くでしょう -

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

名前空間システムの名前空間を xaml に追加してください -

xmlns:s="clr-namespace:System;assembly=mscorlib"
于 2012-01-26T08:35:51.683 に答える