如何验证WPF中的数据并设置默认值
本文关键字:数据 设置 默认值 WPF 何验证 验证 | 更新日期: 2023-09-27 18:21:24
我正在尝试执行验证属性。我们有一个可为null的属性,名为:
public int? Number
{
get { return _number; }
set
{
if (_number != value)
{
_number = value;
RaisePropertyChanged("Number");
}
}
}
并且此属性绑定到一个文本框。我只想验证这两个escenarios:
- 假设用户将文本框留空(textbox.text="),那么Number属性必须接收null值(而不是")
- 如果用户输入"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);
}
}
...
}
尝试以下转换器:
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;
}
}
您可以使用转换器并在将值分配给基础属性之前对其进行操作。
使用@Amit的转换器,然后使用带有以下代码的IDataErrorInfo获取错误:
public string this[string columnName]
{
get
{
if (columnName == "Number")
{
if (Number == null) return "Invalid number";
}
return null;
}
}
或者,您可以使用ValidationRule进行验证,但需要更改其ValidationStep属性。您的验证当前在默认时间RawProposedValue启动,即在转换器启动之前。