2

我正在尝试执行验证属性。我们有一个可以为空的属性,称为:

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

这个属性绑定到一个文本框。我只想验证这两个场景:

  • 假设用户将文本框留空(textbox.text=""),因此 Number 属性必须接收空值(而不是 "" )。
  • 如果用户输入“2b”,Number 属性必须有一个空值(因为是一个错误),但文本框仍然必须说“2b”。

我猜 IDataNotifyError 和 ValidationRules 不适用于此。我该如何解决这些情况?

编辑:当用户输入不正确的格式时,我还使用 ValidationRule 来显示自定义消息。但是当这种情况发生时,不会将属性触发为 null。如果一个 put 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 回答