# 通知設計書 7-DataValidationError

## 概要

本ドキュメントは、Avalonia UIフレームワークにおけるDataValidationError（データ検証エラー）通知の設計について記述する。DataValidationError通知は、入力値のバリデーション失敗時に発生するデータバインディングシステム内部の通知であり、BindingErrorType.DataValidationError として定義されている。

### 本通知の処理概要

DataValidationError通知は、ユーザー入力などのデータバリデーションが失敗した場合に、バインディングシステムおよびUIを通じてエラー情報を伝達する仕組みである。

**業務上の目的・背景**：入力フォームを含むアプリケーションにおいて、ユーザーが入力した値がビジネスルールや制約に適合しない場合、その問題を明確にユーザーに伝える必要がある。DataValidationErrorは、INotifyDataErrorInfo、DataAnnotations（[Required]、[Range]など）、IDataErrorInfo などのバリデーション機構と連携し、入力値の検証結果をUIに反映させる。これにより、ユーザーは問題のある入力を特定し、修正することができる。

**通知の送信タイミング**：データバインディングのソースからターゲットへの値転送時、または ターゲットからソースへの値転送時（TwoWay バインディング）にバリデーションが実行され、エラーが検出されたとき。具体的には、テキストボックスの入力確定時、フォーム送信時などに発生する。

**通知の受信者**：バインディングシステム内部、および DataValidationErrors クラスを通じてUI要素。エラー状態に応じてコントロールのスタイル（赤枠表示など）が変更され、ユーザーに視覚的なフィードバックが提供される。

**通知内容の概要**：Exception オブジェクトを含む BindingNotification インスタンスとして表現される。ErrorType が BindingErrorType.DataValidationError に設定され、バリデーションエラーの詳細情報（エラーメッセージ、対象プロパティなど）が Exception に含まれる。

**期待されるアクション**：ユーザーがエラーメッセージを確認し、入力値を修正する。UIはエラー状態を視覚的に表示し、ユーザーの注意を喚起する。

## 通知種別

内部通知（データバインディングシステム内部） + UI表示（エラー状態スタイル適用）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（バインディング評価時） |
| 優先度 | 通常（UIに反映される） |
| リトライ | なし |

### 送信先決定ロジック

DataValidationErrorは、バリデーションプラグイン（DataAnnotationsValidationPlugin、ExceptionValidationPlugin、IndeiValidationPlugin など）によって検出され、BindingValue<T> を通じてターゲットプロパティに伝播される。UIコントロールは DataValidationErrors クラスを通じてエラー状態を表示する。

## 通知テンプレート

### データ検証エラーの場合

| 項目 | 内容 |
|-----|------|
| エラー情報 | BindingNotification.Error プロパティ |
| エラータイプ | BindingErrorType.DataValidationError |
| フォールバック値 | BindingValue.FallbackValue（設定時） |

### エラー内容

```
BindingNotification
├── Error: {バリデーション例外またはエラーメッセージ}
├── ErrorType: BindingErrorType.DataValidationError
├── Value: {入力値（フォールバック）}
└── HasValue: true/false
```

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| なし | - | - | 内部通知のため添付ファイルは存在しない |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| Error | バリデーションエラーの詳細 | ValidationAttribute、INotifyDataErrorInfo など | Yes |
| ErrorType | エラーの種類（DataValidationError） | BindingErrorType.DataValidationError | Yes |
| Value | エラー発生時の入力値 | バインディングソース | No |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| バリデーション | DataAnnotations検証失敗 | [Required], [Range] 等の違反 | 属性ベースバリデーション |
| バリデーション | INotifyDataErrorInfo | GetErrors() がエラーを返す | インターフェースベースバリデーション |
| バリデーション | IDataErrorInfo | this[propertyName] がエラーを返す | 旧式バリデーション |
| バリデーション | Exception発生 | Setter内で例外スロー | 例外ベースバリデーション |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| バリデーション成功時 | エラーは発生しない |
| EnableDataValidation = false | データバリデーションが無効化されている場合 |

## 処理フロー

### データ検証エラー発生フロー

```mermaid
flowchart TD
    A[値の変更] --> B[バインディング評価]
    B --> C{バリデーションプラグイン実行}
    C --> D{DataAnnotations検証}
    D -->|失敗| E[DataValidationError生成]
    D -->|成功| F{INotifyDataErrorInfo検証}
    F -->|エラーあり| E
    F -->|エラーなし| G{Exception検証}
    G -->|例外発生| E
    G -->|正常| H[値をソースに設定]
    E --> I[BindingValue.DataValidationError生成]
    I --> J[DataValidationErrors.SetError呼び出し]
    J --> K[UIエラー状態表示]
    H --> L[処理完了]
    K --> L
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| なし | - | 内部通知のためデータベースは使用しない |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| なし | - | 内部通知のためデータベースは使用しない |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| Required違反 | 必須フィールドが空 | 値を入力 |
| Range違反 | 値が範囲外 | 有効な範囲内の値を入力 |
| Format違反 | 形式が不正 | 正しい形式で入力 |
| Custom違反 | カスタムバリデーション失敗 | ビジネスルールに従って修正 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（ユーザーが値を修正後に再評価） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | なし |
| 1日あたり上限 | なし |

### 配信時間帯

バリデーション実行時（ユーザー入力時、フォーム送信時など）

## セキュリティ考慮事項

- バリデーションエラーメッセージに機密情報を含めないこと
- エラーメッセージは攻撃者に有用な情報（有効なユーザー名など）を開示しないこと
- サーバーサイドでも必ずバリデーションを実行すること

## 備考

- DataValidationError は BindingError（No.6）とは異なり、入力値の検証エラーを示す
- UIコントロールは DataValidationErrors 添付プロパティを通じてエラー状態を表示
- ExceptionValidationPlugin はセッター内で発生した例外をキャッチしてバリデーションエラーとして扱う
- EnableDataValidation オプションでデータバリデーションの有効/無効を制御可能

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

DataValidationError の定義を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | BindingNotification.cs | `src/Avalonia.Base/Data/BindingNotification.cs` | BindingErrorType.DataValidationError の定義（値 = 2） |
| 1-2 | BindingValue.cs | `src/Avalonia.Base/Data/BindingValue.cs` | BindingValueType.DataValidationError の定義 |

**読解のコツ**: DataValidationError は BindingError とは異なり、バリデーション失敗を示す。ErrorType で区別される。

#### Step 2: バリデーションプラグインを理解する

バリデーションエラーがどのように生成されるかを確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | DataAnnotationsValidationPlugin.cs | `src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs` | DataAnnotations ベースのバリデーション |
| 2-2 | ExceptionValidationPlugin.cs | `src/Avalonia.Base/Data/Core/Plugins/ExceptionValidationPlugin.cs` | 例外ベースのバリデーション |
| 2-3 | IndeiValidationPlugin.cs | `src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs` | INotifyDataErrorInfo ベースのバリデーション |

**主要処理フロー**:
- 各プラグインがバインディングの値を検証
- エラーが見つかった場合は BindingValue<T>.DataValidationError() を返す

#### Step 3: エラー伝播を理解する

バリデーションエラーがUIにどのように反映されるかを確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | BindingValue.cs | `src/Avalonia.Base/Data/BindingValue.cs` | DataValidationError() ファクトリメソッド |

**主要処理フロー**:
- **381-386行目**: `DataValidationError(Exception e)` で BindingValueType.DataValidationError を生成
- **393-398行目**: `DataValidationError(Exception e, T fallbackValue)` でフォールバック値付きエラーを生成

### プログラム呼び出し階層図

```
ユーザー入力
    │
    ├─ TwoWay バインディング評価
    │      │
    │      ├─ DataAnnotationsValidationPlugin
    │      │      └─ ValidationAttribute.IsValid() 失敗
    │      │             └─ BindingValue<T>.DataValidationError(exception)
    │      │
    │      ├─ ExceptionValidationPlugin
    │      │      └─ Setter で例外発生
    │      │             └─ BindingValue<T>.DataValidationError(exception)
    │      │
    │      └─ IndeiValidationPlugin
    │             └─ INotifyDataErrorInfo.GetErrors() にエラー
    │                    └─ BindingValue<T>.DataValidationError(exception)
    │
    └─ DataValidationErrors.SetError(control, error)
           │
           └─ UI エラー状態表示（赤枠など）
```

### データフロー図

```
[入力]                    [処理]                              [出力]

ユーザー入力             バリデーションプラグイン            BindingValue<T>
├─ 入力値         ───▶   ├─ DataAnnotations検証     ───▶    ├─ Type = DataValidationError
├─ DataContext          ├─ INDEI検証                        ├─ Error = ValidationException
└─ Binding              └─ Exception検証                     └─ Value = 入力値
                                │
                                ▼
                         DataValidationErrors
                         └─ UI表示（赤枠、エラーメッセージ）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| BindingNotification.cs | `src/Avalonia.Base/Data/BindingNotification.cs` | ソース | BindingErrorType.DataValidationError 定義 |
| BindingValue.cs | `src/Avalonia.Base/Data/BindingValue.cs` | ソース | DataValidationError() ファクトリメソッド |
| DataAnnotationsValidationPlugin.cs | `src/Avalonia.Base/Data/Core/Plugins/DataAnnotationsValidationPlugin.cs` | ソース | DataAnnotations バリデーション |
| ExceptionValidationPlugin.cs | `src/Avalonia.Base/Data/Core/Plugins/ExceptionValidationPlugin.cs` | ソース | 例外バリデーション |
| IndeiValidationPlugin.cs | `src/Avalonia.Base/Data/Core/Plugins/IndeiValidationPlugin.cs` | ソース | INotifyDataErrorInfo バリデーション |
