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」と表示される必要があります。

IDataNotifyError と ValidationRules がこれに対して機能していないと思います。これらの状況を解決するにはどうすればよいですか?

編集: ユーザーが間違った形式を入力したときにカスタム メッセージを表示するために、ValidationRule も使用しています。ただし、これが発生した場合、プロパティは null になりません。そのエラーに true を入力すると、起動しましたが、エラー メッセージは表示されません。

                 <TextBox.Text>
                    <Binding Path="Number" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" ValidatesOnExceptions="True" NotifyOnValidationError="True" Converter="{x:Static c:IntConverter.Default}" >
                        <Binding.ValidationRules>
                                <r:NumericValidation />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>

検証規則

public class NumericValidation : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        int? response;
        bool noIllegalChars = TryParseStruct<int>(value.ToString(), out response);

        if (noIllegalChars == false)
        {
            return new ValidationResult(false, "Input is not in a correct format.");
        }
        else
        {
            return new ValidationResult(true, null);
        }
    }

    ...
}
4

3 に答える 3

3

次のコンバーターを試してください。

public class IntConverter : IValueConverter
{
    public object Convert(object value,
                          Type targetType,
                          object parameter,
                          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,
                              CultureInfo culture)
    {
        if(value is string)
        {
            int number;
            if (Int32.TryParse((string)value, out number))
            {
                return number;
            }
        }

        return null;
    }
}
于 2012-01-25T05:29:28.550 に答える
2

コンバーターを使用して、基になるプロパティに割り当てられる前に値を操作できます。

于 2012-01-25T05:11:50.340 に答える
1

@Amit のコンバーターを使用してから、次のコードで IDataErrorInfo を使用してエラーを取得します。

public string this[string columnName]
{
    get
    {
        if (columnName == "Number")
        {
            if (Number == null) return "Invalid number";
        }

        return null;
    }
}

または、ValidationRule でそれを行うこともできますが、その ValidationStep プロパティを変更する必要があります。検証は現在、デフォルトの時間 RawProposedValue で、つまりコンバーターが起動する前に起動されています。

于 2012-01-25T06:39:11.097 に答える