# 画面設計書 26-Data Validation

## 概要

本ドキュメントは、Avalonia ControlCatalogサンプルアプリケーションにおけるData Validationデモページの画面設計を定義するものです。

### 本画面の処理概要

本画面は、Avaloniaのデータバリデーション機能をデモンストレーションするためのページです。DataAnnotationsによる宣言的バリデーション、セッター例外によるバリデーション、カスタムエラーコンバーターによるエラーメッセージカスタマイズなど、入力検証の各種パターンを学習・検証できる環境を提供します。

**業務上の目的・背景**：データバリデーションは、ユーザー入力の正当性を検証し、不正なデータがシステムに入力されることを防ぐ重要な機能です。フォーム入力における必須チェック、フォーマットチェック、範囲チェックなど、業務アプリケーションでは不可欠な機能です。Avaloniaでは、.NETのDataAnnotations属性やINotifyDataErrorInfoインターフェースを活用した宣言的バリデーションをサポートしています。

**画面へのアクセス方法**：ControlCatalogアプリケーションのメインウィンドウから、HamburgerMenuのナビゲーションで「Data Validation」を選択することでアクセスできます。

**主要な操作・処理内容**：
1. DataAnnotations（Required, EmailAddress, MinLength）によるメール検証デモ
2. カスタムエラーコンバーターによるエラーメッセージカスタマイズデモ
3. セッター例外によるバリデーションと、例外メッセージのカスタマイズデモ
4. TooltipDataValidationErrorsテーマによるツールチップ形式のエラー表示

**画面遷移**：MainViewからHamburgerMenuナビゲーションを通じて遷移。画面内での追加遷移なし。

**権限による表示制御**：特になし（サンプルアプリケーション）

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 58 | Binding | 主機能 | データバリデーションのデモ。入力検証機能 |

## 画面種別

デモ / サンプル表示

## URL/ルーティング

HamburgerMenu内部ナビゲーション（直接URLルーティングなし）

## 入出力項目

| 項目名 | 種別 | データ型 | 必須 | 説明 |
|--------|------|----------|------|------|
| Email1 | 入力 | string | Yes | 標準DataAnnotationsバリデーション対象 |
| Email2 | 入力 | string | Yes | カスタムエラーコンバーター使用 |
| SetterException | 入力 | string | - | セッター例外バリデーション対象（5文字以上必須） |

## 表示項目

| 項目名 | データ型 | 説明 |
|--------|----------|------|
| Email validation ラベル | string | Email1 TextBoxのラベル |
| Email validation with custom error converter ラベル | string | Email2 TextBoxのラベル |
| Setter exception with custom error converter and tooltip error ラベル | string | SetterException TextBoxのラベル |

## イベント仕様

### 1-Email1 TextBox入力変更

TextBoxのText変更時、DataAnnotationsSampleプロパティへのバインディングにより、以下のバリデーションが実行される：
- Required: 必須チェック
- EmailAddress: メールアドレス形式チェック
- MinLength(5): 最小5文字チェック

バリデーションエラー発生時は、TextBox下部に赤色のエラーメッセージが表示される。

### 2-Email2 TextBox入力変更

Email1と同様のバリデーションが実行されるが、DataValidationErrors.ErrorConverter属性により、カスタムコンバーターでエラーメッセージが加工される。「Error: {元のエラーメッセージ}」形式で表示される。

### 3-SetterException TextBox入力変更

ExceptionInsideSetterSampleプロパティのセッターで、5文字未満の入力時にArgumentOutOfRangeExceptionがスローされる。ExceptionConverterにより「Huh, there was an Exception: {例外メッセージ}」形式で表示される。TooltipDataValidationErrorsテーマによりツールチップ形式で表示。

## データベース更新仕様

### 操作別データベース影響一覧

本画面はUIコントロールのデモであり、データベース操作は行いません。

## メッセージ仕様

| 種別 | メッセージID | メッセージ内容 | 表示条件 |
|------|-------------|---------------|----------|
| エラー | - | The {field} field is required. | 必須項目が空の場合 |
| エラー | - | The {field} field is not a valid e-mail address. | メールアドレス形式不正 |
| エラー | - | Error: {元のエラー} | カスタムコンバーター適用時 |
| エラー | - | Huh, there was an Exception: Give me 5 or more letter please :-) | セッター例外発生時 |

## 例外処理

- セッター内でのArgumentOutOfRangeExceptionはバリデーションエラーとして処理される
- エラーはDataValidationErrorsコントロールで表示される

## 備考

- DataAnnotationsはSystem.ComponentModel.DataAnnotations名前空間
- INotifyDataErrorInfoは暗黙的に実装される（MiniMvvmのViewModelBase経由）
- ErrorConverterはFunc<object, object>型のデリゲート
- TooltipDataValidationErrorsテーマでツールチップ表示に切り替え可能

---

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

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

### 推奨読解順序

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

まず、バリデーション対象のViewModelを理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | DataValidationViewModel.cs | `samples/ControlCatalog/ViewModels/DataValidationViewModel.cs` | DataAnnotations属性、Converterプロパティ、セッター例外処理（行1-45） |

**読解のコツ**: DataAnnotationsの[Required], [EmailAddress], [MinLength]属性がプロパティに適用されています。セッターでの例外スローもバリデーションエラーとして扱われます。

#### Step 2: エントリーポイントを理解する

処理の起点となるUserControlとXAMLレイアウトを特定します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | DataValidationPage.axaml | `samples/ControlCatalog/Pages/DataValidationPage.axaml` | TextBoxへのバインディング、DataValidationErrors.ErrorConverter属性、TooltipDataValidationErrorsテーマ |

**主要処理フロー**:
1. **行9-11**: UserControl.DataContextでViewModelインスタンス生成
2. **行13-17**: Email1 TextBox - 標準バリデーション
3. **行19-25**: Email2 TextBox - カスタムErrorConverter使用
4. **行27-39**: SetterException TextBox - 例外ベースバリデーション、ツールチップテーマ

#### Step 3: ViewModelのバリデーションロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | DataValidationViewModel.cs | `samples/ControlCatalog/ViewModels/DataValidationViewModel.cs` | 各プロパティの実装と例外処理 |

**主要処理フロー**:
- **行10-19**: DataAnnotationsSampleプロパティ - [Required], [EmailAddress], [MinLength(5)]
- **行21-24**: Converterプロパティ - エラーメッセージに「Error: 」プレフィックス追加
- **行27-38**: ExceptionInsideSetterSampleプロパティ - 5文字未満で例外スロー
- **行41-44**: ExceptionConverterプロパティ - 例外メッセージをカスタムフォーマット

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

```
DataValidationPage (UserControl)
    │
    ├─ DataContext (XAML内で設定)
    │      └─ DataValidationViewModel
    │
    ├─ Email1 TextBox
    │      └─ Text="{Binding DataAnnotationsSample}"
    │             └─ DataAnnotations検証
    │                    ├─ [Required]
    │                    ├─ [EmailAddress]
    │                    └─ [MinLength(5)]
    │
    ├─ Email2 TextBox
    │      ├─ Text="{Binding DataAnnotationsSample}"
    │      └─ DataValidationErrors.ErrorConverter="{Binding Converter}"
    │             └─ Func<object, object>: "Error: {0}"
    │
    └─ SetterException TextBox
           ├─ Text="{Binding ExceptionInsideSetterSample}"
           │      └─ set時にArgumentOutOfRangeException
           ├─ DataValidationErrors.ErrorConverter="{Binding ExceptionConverter}"
           └─ Theme="{DynamicResource TooltipDataValidationErrors}"
```

### データフロー図

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

TextBox入力 ───────────▶ プロパティセッター ─────────────▶ 値更新 or 例外
                              │
                              ├─ DataAnnotations検証
                              │      └─ ValidationResult ────▶ エラー表示
                              │
                              └─ セッター例外
                                     └─ Exception ───────────▶ エラー表示

ErrorConverter ─────────▶ エラーオブジェクト変換 ─────────▶ カスタムメッセージ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| DataValidationPage.axaml | `samples/ControlCatalog/Pages/DataValidationPage.axaml` | XAML | 画面レイアウト定義 |
| DataValidationPage.axaml.cs | `samples/ControlCatalog/Pages/DataValidationPage.axaml.cs` | ソース | コードビハインド（空） |
| DataValidationViewModel.cs | `samples/ControlCatalog/ViewModels/DataValidationViewModel.cs` | ソース | バリデーションロジック |
| ViewModelBase.cs | `samples/ControlCatalog/ViewModels/ViewModelBase.cs` (MiniMvvm) | ソース | INotifyDataErrorInfo実装基底クラス |
