C# float.NaN的DataAnnotations属性
我正在使用C# float.NaN的DataAnnotations属性,c#,.net,wpf,validation,data-annotations,C#,.net,Wpf,Validation,Data Annotations,我正在使用DataAnnotations验证我的ViewModel(WPF),因此,如果用户键入的内容不是浮点值,并且值超出范围,我可以控制某些按钮的启用状态 [Range(0, float.MaxValue, ErrorMessage = "StepSize must be more than 0")] public float StepSize { get { return model.StepSize;
DataAnnotations
验证我的ViewModel
(WPF)
,因此,如果用户键入的内容不是浮点值,并且值超出范围,我可以控制某些按钮的启用状态
[Range(0, float.MaxValue, ErrorMessage = "StepSize must be more than 0")]
public float StepSize
{
get { return model.StepSize; }
set
{
model.StepSize = value;
RaisePropertyChangedAndRevalidate(nameof(StepSize));
}
}
private void RaisePropertyChangedAndRevalidate(string propertyName)
{
RaisePropertyChanged(propertyName);
if (_fieldBindingErrors == 0)
{
RaisePropertyChanged(nameof(IsValid));
}
}
private int _fieldBindingErrors = 0;
public ICommand RegisterFieldBindingErrors
{
get
{
return new RelayCommand<ValidationErrorEventArgs>(e =>
{
if (e.Action == ValidationErrorEventAction.Added)
{
_fieldBindingErrors++;
}
else
{
_fieldBindingErrors--;
}
RaisePropertyChanged(nameof(IsValid));
});
}
}
public bool IsValid
{
get
{
bool valid = Validator.TryValidateObject(this,
new ValidationContext(this, null, null),
new List<System.ComponentModel.DataAnnotations.ValidationResult>())
&& _fieldBindingErrors == 0;
return valid;
}
}
[范围(0,float.MaxValue,ErrorMessage=“步长必须大于0”)]
公共浮动步长
{
获取{return model.StepSize;}
设置
{
model.StepSize=值;
RAISEPROPERTYCHANGE和重新验证(名称(步长));
}
}
私有void raisePropertyChangedRevalidate(字符串propertyName)
{
RaisePropertyChanged(propertyName);
如果(_fieldBindingErrors==0)
{
RaisePropertyChanged(名称(IsValid));
}
}
私有int_fieldBindingErrors=0;
公共ICommand注册表字段绑定错误
{
得到
{
返回新的RelayCommand(e=>
{
if(e.Action==validationErrorReventation.Added)
{
_fieldBindingErrors++;
}
其他的
{
_字段绑定错误--;
}
RaisePropertyChanged(名称(IsValid));
});
}
}
公共布尔是有效的
{
得到
{
bool valid=Validator.TryValidateObject(此,
新的ValidationContext(this,null,null),
新列表())
&&_fieldBindingErrors==0;
返回有效;
}
}
问题是,当我将textbox.Text字符串转换为float时,我必须将该值设置为无效值(在不使用Range属性的情况下也适用于一般情况)。因此我将该值设置为float.NaN。
问题是NaN似乎是一个有效的浮点,它甚至通过了上面的范围验证
是否有一个属性可用于验证该值是否为NaN?找到了一个解决方案,我创建了一个自定义验证规则,并将其应用到XAML中 类StepSizeValidationRule:ValidationRule { 私人互联网;; 私人国际最大值
public StepSizeValidationRule()
{
}
public int Min
{
get { return _min; }
set { _min = value; }
}
public int Max
{
get { return _max; }
set { _max = value; }
}
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
float stepSize = 0;
try
{
if (!float.TryParse(value.ToString(), out stepSize))
{
return new ValidationResult(false, "Not a float");
}
}
catch (Exception e)
{
return new ValidationResult(false, "Not a float " + e.Message);
}
if (float.IsNaN(stepSize))
{
return new ValidationResult(false, "Not a float ");
}
if ((stepSize < Min) || (stepSize > Max))
{
return new ValidationResult(false,
"Please enter a stepSize in the range: " + Min + " - " + Max + ".");
}
else
{
return new ValidationResult(true, null);
}
}
}
public步骤sizevalidationrule()
{
}
公共int Min
{
获取{return\u min;}
设置{u min=value;}
}
公共整数最大值
{
获取{return\u max;}
设置{u max=value;}
}
公共覆盖验证结果验证(对象值,CultureInfo CultureInfo)
{
浮动步长=0;
尝试
{
如果(!float.TryParse(value.ToString(),out stepSize))
{
返回新的ValidationResult(false,“非浮点”);
}
}
捕获(例外e)
{
返回新的ValidationResult(false,“非浮点”+e.Message);
}
if(浮点型IsNaN(步长))
{
返回新的ValidationResult(false,“非浮点”);
}
如果((步长<最小值)| |(步长>最大值))
{
返回新的ValidationResult(false,
请输入范围为“+Min+”-“+Max+”的步长;
}
其他的
{
返回新的ValidationResult(true,null);
}
}
}