你好!如果你是 WPF 开发的初学者,并且正在学习 MVVM 模式,那么这篇笔记就是为你准备的。我们将通过一个简单的示例,一步步讲解 ObservableValidator
的使用方法,让你轻松掌握在 MVVM 框架中如何进行数据验证。
我们将使用 CommunityToolkit.Mvvm(以前叫 MVVM Toolkit)这个强大的库来简化开发。
一、什么是 ObservableValidator?
ObservableValidator
是 CommunityToolkit.Mvvm 提供的一个基类,它帮助我们在 ViewModel 中实现数据校验功能。
它的作用是:
- 让你的 ViewModel 能够检测属性是否符合验证规则(比如:不能为空、必须是邮箱格式等)。
- 与 WPF 的界面绑定无缝集成,自动显示错误信息。
- 支持“实时校验”和“提交时校验”两种方式。
简单说:它帮你判断用户输入的数据合不合规,并把错误提示显示在界面上。
二、核心代码解析
我们来看你提供的代码,分两部分讲解:ViewModel(逻辑) 和 View(界面)。
1. ViewModel:ObservableValidatorDemoViewModel.cs
namespace WpfToolKitDemo.ViewModels
{internal partial class ObservableValidatorDemoViewModel : ObservableValidator{// ...}
}
✅ 继承 ObservableValidator
: ObservableValidator
这表示这个 ViewModel 支持数据校验。它提供了以下关键功能:
ValidateProperty()
:校验单个属性ValidateAllProperties()
:校验所有属性HasErrors
:是否有错误GetErrors()
:获取所有错误信息
✅ 使用 [ObservableProperty] 自动生成属性
[ObservableProperty]
int _age;
这是 CommunityToolkit 的“源生成器”功能,它会自动生成完整的属性,等价于:
private int _age;
public int Age
{get => _age;set => SetProperty(ref _age, value);
}
同时,它还能触发校验机制。
✅ 添加校验规则(使用特性 Attributes)
[Range(0, 120)]
[Required]
int _age;
这些叫“数据注解(Data Annotations)”,用来定义规则:
[Required]
:必填项[Range(0,120)]
:数值必须在 0 到 120 之间[EmailAddress]
:必须是合法邮箱格式
系统会自动根据这些规则判断输入是否合法。
✅ 实现“实时校验”:OnAgeChanged
partial void OnAgeChanged(int value)
{ValidateProperty(value, nameof(Age));
}
这是关键!OnAgeChanged
是 [ObservableProperty]
自动生成的“属性改变回调”。
我们在这里调用 ValidateProperty
,表示:每当 Age 被修改,就立即校验它。
这样用户一输入非法数字(比如 -5 或 150),就能马上看到错误提示。
⚠️ 注意:
OnEmailChanged
,所以它不会实时校验,只在点击提交时才检查。
✅ 提交按钮逻辑:Submit 命令
[RelayCommand]
void Submit()
{ValidateAllProperties();if (HasErrors){ErrMessages = string.Join(Environment.NewLine, GetErrors().Select(e => e.ErrorMessage));}else{ErrMessages = "";}
}
[RelayCommand]
:自动生成一个命令(ICommand),可以直接在 XAML 中绑定按钮。ValidateAllProperties()
:校验所有带校验特性的属性。HasErrors
:判断是否有任何错误。GetErrors()
:获取所有错误信息,我们用换行符拼接显示。
✅ 显示错误信息:ErrMessages
[ObservableProperty]
string _errMessages;
这个属性用来把错误信息传递给界面,显示出来。
2. View:ObservableValidatorDemoView.xaml
<Window.DataContext><viewmodels:ObservableValidatorDemoViewModel/>
</Window.DataContext>
设置数据上下文为我们的 ViewModel。
<StackPanel><TextBox Text="{Binding Age}"/><TextBox Text="{Binding Email}"/><TextBlock FontSize="20" Text="{Binding ErrMessages}"/><Button Content="Submit" Command="{Binding SubmitCommand}"/>
</StackPanel>
- 两个
TextBox
绑定 Age 和 Email。 TextBlock
显示错误信息。Button
绑定SubmitCommand
(由[RelayCommand]
自动生成)。
三、运行效果演示
假设用户操作如下:
操作 | 界面反馈 |
---|---|
输入 Age 为 -5 |
实时提示:值必须在 0 到 120 之间 |
输入 Email 为 abc |
点击“Submit”后提示:必须是合法邮箱 |
留空 Age 不填 | 提交时提示:Age 是必填项 |
正确填写所有项 | 错误信息清空,提交成功 |
四、关键知识点总结
概念 | 说明 |
---|---|
ObservableValidator |
校验基类,提供校验能力 |
[Required] 、[Range] 、[EmailAddress] |
常用校验规则特性 |
ValidateProperty() |
校验单个属性(适合实时校验) |
ValidateAllProperties() |
校验所有属性(适合提交时) |
HasErrors |
判断是否有错误 |
GetErrors() |
获取错误集合 |
partial void OnXXXChanged |
属性变化时的回调,用于触发实时校验 |
[RelayCommand] |
自动生成命令,简化按钮绑定 |
五、给初学者的小建议
- 先理解绑定:确保你明白
{Binding Age}
是怎么把界面和代码连起来的。 - 从简单开始:先用
Required
和Range
,再尝试RegularExpression
等高级规则。 - 调试技巧:可以在
OnAgeChanged
或Submit
里加断点,看看HasErrors
的值变化。 - 错误显示方式:除了
TextBlock
,你还可以用Validation.ErrorTemplate
显示更美观的红框提示。
六、扩展思考
-
如何让 Email 也实现“实时校验”?
👉 只需添加:partial void OnEmailChanged(string value) {ValidateProperty(value, nameof(Email)); }
-
如何自定义错误提示?
👉 加上ErrorMessage
参数:[Required(ErrorMessage = "年龄不能为空!")] [Range(0, 120, ErrorMessage = "年龄必须在 0 到 120 岁之间")]
结语
ObservableValidator
是 WPF MVVM 中非常实用的工具,它让数据校验变得简洁、清晰。通过这个例子,你已经掌握了它的基本用法:定义规则 → 实时或提交校验 → 显示错误。
继续练习,你会越来越熟练!加油!