Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# float.NaN的DataAnnotations属性_C#_.net_Wpf_Validation_Data Annotations - Fatal编程技术网

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