Implements WPF data validation using ValidationRule, IDataErrorInfo, and INotifyDataErrorInfo. Use when building forms, validating user input, or displaying validation errors in UI.
View on GitHubchristian289/dotnet-with-claudecode
wpf-dev-pack
January 23, 2026
Select agents to install to:
npx add-skill https://github.com/christian289/dotnet-with-claudecode/blob/main/wpf-dev-pack/skills/implementing-wpf-validation/SKILL.md -a claude-code --skill implementing-wpf-validationInstallation paths:
.claude/skills/implementing-wpf-validation/# WPF Data Validation
## 1. Validation Approaches
| Approach | Location | Pros | Cons |
|----------|----------|------|------|
| `ValidationRule` | XAML (Binding) | Simple, declarative XAML | Hard to separate from ViewModel |
| `IDataErrorInfo` | ViewModel | ViewModel integration | Synchronous validation only |
| `INotifyDataErrorInfo` | ViewModel | Async support, multiple errors | Complex implementation |
| `ExceptionValidationRule` | XAML | Exception-based | Potential performance impact |
---
## 2. ValidationRule
### 2.1 Custom ValidationRule
```csharp
public sealed partial class EmailValidationRule : ValidationRule
{
[GeneratedRegex(@"^[^@\s]+@[^@\s]+\.[^@\s]+$", RegexOptions.IgnoreCase)]
private static partial Regex EmailPattern();
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (value is not string email || string.IsNullOrWhiteSpace(email))
{
return new ValidationResult(false, "Please enter an email address.");
}
if (!EmailPattern().IsMatch(email))
{
return new ValidationResult(false, "Invalid email format.");
}
return ValidationResult.ValidResult;
}
}
```
> **Note**: Uses `GeneratedRegexAttribute` for compile-time regex. See `using-generated-regex` skill.
### 2.2 XAML Usage
```xml
<TextBox>
<TextBox.Text>
<Binding Path="Email" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:EmailValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
```
### 2.3 Error Template
```xml
<Style TargetType="TextBox">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel>
<TextBlock DockPanel.Dock="Right" Foreground="Red" Text="!"
FontWeight="Bold" Margin="5,0"/>