ObservableValidator整数验证异常:ViewModel的HasErrors属性未更新
解决方案
问题根源
int是值类型,没法存null:当你输入空内容时,绑定系统会自动把属性值设成int的默认值0,这时候Required验证根本触发不了;而且GUI显示的错误大概率是绑定层无法把空字符串转成int的错误,不是ViewModel里的验证错误,所以HasErrors自然不会同步更新。
具体修复步骤
1. 把属性改成可空整数(int?)
直接修改ViewModel里的属性类型,让空输入能被正确识别成null,这样Required验证就能正常工作了:
[ObservableProperty] [NotifyDataErrorInfo] [Required(ErrorMessage = "Number of Pins must be greater than 0")] [Range(1, int.MaxValue, ErrorMessage = "Number of Pins must be greater than 0")] private int? createPartLibraryNumberOfPins;
改成可空类型后,输入空内容时属性值会变成null,Required验证立马生效,ObservableValidator会正确标记错误,HasErrors也就同步更新了。
2. 调整绑定的更新时机
在View的绑定设置里,把UpdateSourceTrigger设为PropertyChanged,确保输入一变化就同步到ViewModel:
<!-- WPF示例 --> <TextBox Text="{Binding CreatePartLibraryNumberOfPins, UpdateSourceTrigger=PropertyChanged}" />
避免因为延迟更新,导致ViewModel的属性没及时跟上输入变化,进而HasErrors没更新。
3. 优化输入框显示(可选)
如果输入框还会显示绑定相关的错误提示,可以加个TargetNullValue,把ViewModel里的null映射成空字符串,让显示和ViewModel状态一致:
<TextBox Text="{Binding CreatePartLibraryNumberOfPins, UpdateSourceTrigger=PropertyChanged, TargetNullValue=''}" />
内容的提问来源于stack exchange,提问作者Justin CI
相关产品推荐
相关产品推荐

