WPF中NotEmptyValidationRule阻止浮点数小数点、逗号输入问题咨询
问题原因
该问题和非空校验规则的逻辑本身无关,是WPF绑定的校验执行时机、类型转换规则共同作用导致的:
- 绑定配置了
UpdateSourceTrigger="PropertyChanged",每输入一个字符就会立刻尝试将输入字符串转换为源属性对应的float?类型 - 当你输入小数点
.时,当前输入的半截内容(例如1.)无法被默认类型转换器识别为合法float值,类型转换直接失败 - ValidationRule的默认执行时机为
ValidationStep="ConvertedProposedValue",也就是等类型转换完成后才会执行校验逻辑,此时转换失败的错误会先被触发,WPF默认会回滚这次无效输入,表现为小数点/逗号被拦截无法输入 - 未添加校验规则时WPF对转换失败的默认处理更宽松,因此不会出现输入拦截的问题
解决方法
方案1:调整校验规则执行时机
给NotEmptyValidationRule添加ValidationStep="RawProposedValue"属性,让校验逻辑在类型转换之前直接基于原始输入字符串执行,不会被提前的转换失败影响输入操作:
<local:NotEmptyValidationRule ValidatesOnTargetUpdated="True" ValidationStep="RawProposedValue"/>
该方案可以保留UpdateSourceTrigger="PropertyChanged"实时校验的特性。
方案2:修改绑定更新触发时机
将绑定的UpdateSourceTrigger从PropertyChanged改为LostFocus,仅在输入框失去焦点时才执行类型转换和校验,输入完整浮点数值后再转换就不会出现半截内容转换失败的问题:
<Binding Path="SelectedSpeed" UpdateSourceTrigger="LostFocus"> <!-- 其余绑定配置保持不变 --> <Binding.ValidationRules> <local:NotEmptyValidationRule ValidatesOnTargetUpdated="True"/> </Binding.ValidationRules> </Binding>
该方案更符合数值类内容的输入交互习惯,也能避免输入过程中频繁触发校验提示。
内容的提问来源于stack exchange,提问作者Ozgur Saklanmaz
相关产品推荐
相关产品推荐

