Back to Skills

implementing-wpf-validation

verified

Implements WPF data validation using ValidationRule, IDataErrorInfo, and INotifyDataErrorInfo. Use when building forms, validating user input, or displaying validation errors in UI.

View on GitHub

Marketplace

dotnet-claude-plugins

christian289/dotnet-with-claudecode

Plugin

wpf-dev-pack

development

Repository

christian289/dotnet-with-claudecode
5stars

wpf-dev-pack/skills/implementing-wpf-validation/SKILL.md

Last Verified

January 23, 2026

Install Skill

Select agents to install to:

Scope:
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-validation

Installation paths:

Claude
.claude/skills/implementing-wpf-validation/
Powered by add-skill CLI

Instructions

# 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"/>
    

Validation Details

Front Matter
Required Fields
Valid Name Format
Valid Description
Has Sections
Allowed Tools
Instruction Length:
7357 chars