WPF如何实现点击提交按钮后触发表单验证
WPF点击按钮才触发输入验证实现方案
你的判断是对的,验证提前触发的核心原因就是绑定配置了UpdateSourceTrigger="PropertyChanged",只要调整绑定触发模式,配合手动触发绑定更新就能实现和HTML5表单一致的提交时校验效果,具体改法如下:
1. 修改绑定触发模式为显式触发
把输入框绑定的UpdateSourceTrigger属性值从PropertyChanged改为Explicit,这个模式下绑定不会在用户输入、控件失焦时自动同步值到数据源、触发验证,只有手动调用更新方法时才会执行校验逻辑。
修改后的输入框XAML代码:
<!-- 给输入框加x:Name方便后台获取绑定对象 --> <TextBox x:Name="AgeInput" Style="{StaticResource textBoxInError}"> <TextBox.Text> <Binding Path="Age" Source="{StaticResource data}" ValidatesOnExceptions="True" UpdateSourceTrigger="Explicit"> <Binding.ValidationRules> <DataErrorValidationRule/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>
2. 给提交按钮加点击事件,手动触发验证
给Submit按钮绑定点击事件,在事件逻辑中手动调用绑定的UpdateSource()方法,这个方法会自动执行配置的所有验证规则:验证不通过时会自动触发你写的错误提示样式,验证通过才会把输入值同步到绑定的Person对象。
首先修改按钮XAML,绑定点击事件:
<Button Click="SubmitBtn_Click">Submit</Button>
然后在后台MainWindow.xaml.cs中添加事件处理逻辑:
private void SubmitBtn_Click(object sender, RoutedEventArgs e) { // 获取年龄输入框的文本绑定表达式 BindingExpression ageBindingExp = AgeInput.GetBindingExpression(TextBox.TextProperty); // 手动触发值同步和验证逻辑 ageBindingExp.UpdateSource(); // 检查当前输入框是否存在验证错误 if (Validation.GetHasError(AgeInput)) { // 校验不通过,直接返回不执行后续提交逻辑 return; } // 校验通过,执行后续表单提交业务即可 Person formData = (Person)FindResource("data"); // 后续业务逻辑,比如数据存储、接口提交等 }
多输入框扩展说明
如果表单有多个需要校验的输入项,只需要在提交事件中遍历所有输入控件,挨个调用对应绑定的UpdateSource()方法,再统一检查是否存在校验错误即可,逻辑和单输入框完全一致。
这种实现方式下,用户输入过程中不会弹出任何校验提示,只有点击提交按钮时才会标记不符合规则的输入项,和HTML5自带的required属性校验行为完全一致。
内容的提问来源于stack exchange,提问作者David Krásný
相关产品推荐
相关产品推荐

