# 画面設計書 109-メインウィンドウ

## 概要

本ドキュメントは、BindingDemoアプリケーションのメインウィンドウの画面設計書です。

### 本画面の処理概要

本画面は、Avaloniaフレームワークのデータバインディング機能をデモンストレーションするためのメインウィンドウです。TabControlによるナビゲーションで、様々なバインディングシナリオをタブ別に確認できます。

**業務上の目的・背景**：本画面は、Avaloniaフレームワークのデータバインディング機能を開発者に示すためのデモアプリケーションです。Simple Bindings（TwoWay/OneWay/OneTime）、Collection Bindings、Negated Bindings、Numeric Bindings、Binding Sources、Property Validation（Exception/INotifyDataErrorInfo/DataAnnotations）、Commandsなど、多様なバインディングパターンを一覧できます。

**画面へのアクセス方法**：BindingDemoアプリケーションを起動すると、本ウィンドウが表示されます。

**主要な操作・処理内容**：
1. Basicタブで基本的なバインディング（TwoWay/OneWay/OneTime）を確認
2. ListBoxタブでコレクションバインディングと選択を確認
3. Property Validationタブで入力検証を確認
4. Commandsタブでコマンドバインディングを確認
5. Advancedタブで高度なバインディングを確認

**画面遷移**：
- 遷移元：アプリケーション起動
- 遷移先：なし（タブ内でのコンテンツ切り替え）

**権限による表示制御**：本画面はデモアプリケーションのため、権限による表示制御は実装されていません。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 42 | Window | 主機能 | バインディングデモのメインウィンドウ表示 |
| 16 | TabControl | 補助機能 | TabControl構成によるコンテンツ管理 |
| 58 | Binding | 主機能 | データバインディングのデモ |

## 画面種別

メインウィンドウ

## URL/ルーティング

デスクトップアプリケーションのため、URLルーティングはありません。
クラス名: `BindingDemo.MainWindow`

## 入出力項目

### Basicタブ

| 項目名 | 種別 | データ型 | 必須 | 説明 |
|--------|------|----------|------|------|
| StringValue | 入力/出力 | string | - | 文字列バインディングの値 |
| DoubleValue | 入力/出力 | double | - | 数値バインディングの値 |
| BooleanString | 入力/出力 | string | - | 論理値バインディングの値 |
| Items[1].Value | 入力/出力 | string | - | コレクション内アイテムの値 |
| CurrentTime | 出力 | string | - | 現在時刻（バックグラウンド更新） |
| CurrentTimeObservable | 出力 | DateTimeOffset | - | 現在時刻（Observable） |

### Property Validationタブ

| 項目名 | 種別 | データ型 | 必須 | 説明 |
|--------|------|----------|------|------|
| LessThan10 | 入力 | int | - | 10未満の検証 |
| Maximum | 入力 | int | - | 最大値 |
| Value | 入力 | int | - | 検証対象値 |
| PhoneNumber | 入力 | string | - | 電話番号（DataAnnotations検証） |

### Commandsタブ

| 項目名 | 種別 | データ型 | 必須 | 説明 |
|--------|------|----------|------|------|
| BooleanFlag | 入力/出力 | bool | - | トグルフラグ |

## 表示項目

### Basicタブ
| 項目名 | コントロール名 | 種別 | 説明 |
|--------|--------------|------|------|
| Two Way | first | TextBox | TwoWayバインディング |
| Two Way (LostFocus) | - | TextBox | LostFocusでの更新 |
| One Way | - | TextBox | OneWayバインディング |
| One Time | - | TextBox | OneTimeバインディング |
| Items[1].Value | - | TextBox | コレクションインデックスバインディング |
| Shuffle Button | - | Button | アイテムシャッフルコマンド |
| !BooleanString | - | CheckBox | 否定バインディング |
| DoubleValue | - | TextBox/TextBlock/ProgressBar | 数値バインディング |
| first TextBox参照 | - | TextBox | 名前参照バインディング |
| SharedItem.StringValue | - | TextBox | StaticResourceバインディング |
| Background Thread | - | TextBox | バックグラウンドスレッド更新 |
| StreamOperator | - | TextBox | Observable/Stream演算子 |

### ListBoxタブ
| 項目名 | コントロール名 | 種別 | 説明 |
|--------|--------------|------|------|
| Multiple Selection ListBox | - | ListBox | 複数選択リストボックス |
| Selected Item Content | - | ContentControl | 選択アイテム詳細表示 |

### Property Validationタブ
| 項目名 | コントロール名 | 種別 | 説明 |
|--------|--------------|------|------|
| Exception Validation | - | TextBox | 例外ベース検証 |
| INotifyDataErrorInfo | - | TextBox | INDEI検証 |
| Data Annotations | - | TextBox | DataAnnotations検証 |

### Commandsタブ
| 項目名 | コントロール名 | 種別 | 説明 |
|--------|--------------|------|------|
| Button | - | Button | コマンドバインディング |
| ToggleButton | - | ToggleButton | IsCheckedとコマンド |
| CheckBox | - | CheckBox | 否定IsCheckedとコマンド |
| RadioButton | - | RadioButton | 二重否定IsCheckedとコマンド |
| Nested View Model Button | NestedTest | Button | ネストViewModelコマンド |
| Command Method Do | ToDo | Button | メソッドコマンド |

### Advancedタブ
| 項目名 | コントロール名 | 種別 | 説明 |
|--------|--------------|------|------|
| Generic Markup Extension | - | TextBlock | ジェネリック型マークアップ拡張 |
| Generic Value Converter | - | TextBlock | ジェネリック型コンバーター |

## イベント仕様

本画面のイベント処理は主にViewModelで行われます。

### 1-ShuffleItems Command

ShuffleボタンがクリックされるとItemsコレクション内のアイテムをシャッフルします。

### 2-StringValueCommand

Button/ToggleButton/CheckBox/RadioButtonがクリックされると、BooleanFlagをトグルし、StringValueにパラメータを設定します。

### 3-Do Command

DoボタンがクリックされるとDoメソッドが実行されます（BooleanFlagがtrueの場合のみ有効）。

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

本画面はデモアプリケーションであり、データベースとの連携はありません。

## メッセージ仕様

Property Validationタブで検証エラーがある場合、DataValidationエラーとして表示されます。

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|------------|------|--------------|---------|
| MSG-001 | エラー | 検証エラーメッセージ | 入力値が検証ルールに違反した場合 |

## 例外処理

| 例外状況 | 処理内容 |
|---------|---------|
| 数値変換失敗 | 検証エラーとして表示 |
| LessThan10が10以上 | Exceptionによる検証エラー |

## 備考

- SharedItemはWindow.Resourcesで定義され、複数のTextBoxで共有されます
- CurrentTimeはバックグラウンドスレッドで1秒ごとに更新されます
- CurrentTimeObservableはRx.NETのObservableを使用しています
- CanDoメソッドはDependsOn属性でBooleanFlagに依存しています

---

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

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

### 推奨読解順序

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

ViewModelの構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | MainWindowViewModel.cs | `samples/BindingDemo/ViewModels/MainWindowViewModel.cs` | メインViewModelの実装 |
| 1-2 | ViewModelBase.cs | `samples/BindingDemo/ViewModels/MiniMvvm/ViewModelBase.cs` | MVVM基底クラス |

**読解のコツ**: MainWindowViewModelはINotifyPropertyChangedを実装し、RaiseAndSetIfChangedでプロパティ変更を通知します。コマンドはMiniCommandで実装されています。

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

処理の起点となるXAMLファイルとコードビハインドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | MainWindow.xaml | `samples/BindingDemo/MainWindow.xaml` | 画面レイアウトとバインディング定義 |
| 2-2 | MainWindow.xaml.cs | `samples/BindingDemo/MainWindow.xaml.cs` | コードビハインド（最小限の初期化） |

**主要処理フロー**:
1. **行11-15**: Window.Stylesでh1スタイルを定義
2. **行17-136**: TabControlで各タブを構成
3. **行18-67**: Basicタブ - 基本バインディング
4. **行68-91**: ListBoxタブ - コレクションバインディング
5. **行92-108**: Property Validationタブ - 入力検証
6. **行110-119**: Commandsタブ - コマンドバインディング
7. **行120-135**: Advancedタブ - 高度なバインディング

#### Step 3: バインディングパターンを理解する

様々なバインディングパターンを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | MainWindow.xaml | `samples/BindingDemo/MainWindow.xaml` | バインディング構文 |

**主要処理フロー**:
- **TwoWay**: `{Binding Path=StringValue}` - デフォルト
- **OneWay**: `{Binding Path=StringValue, Mode=OneWay}`
- **OneTime**: `{Binding Path=StringValue, Mode=OneTime}`
- **LostFocus**: `{Binding Path=StringValue, UpdateSourceTrigger=LostFocus}`
- **名前参照**: `{Binding #first.Text, Mode=TwoWay}`
- **StaticResource**: `{Binding Value, Source={StaticResource SharedItem}}`
- **否定**: `{Binding !BooleanString}`
- **Stream**: `{CompiledBinding CurrentTimeObservable^, Mode=OneWay}`

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

```
MainWindow
    │
    ├─ コンストラクタ
    │      ├─ Resources["SharedItem"] = new TestItem<string>()
    │      └─ DataContext = new MainWindowViewModel()
    │
    └─ TabControl
           │
           ├─ Basic Tab
           │      ├─ Simple Bindings (TwoWay/OneWay/OneTime)
           │      ├─ Collection Bindings (Items[1].Value)
           │      ├─ Negated Bindings (!BooleanString)
           │      ├─ Numeric Bindings (DoubleValue)
           │      ├─ Binding Sources (#name, StaticResource)
           │      └─ Scheduler/Stream (CurrentTime, Observable)
           │
           ├─ ListBox Tab
           │      └─ Multiple Selection with SelectionModel
           │
           ├─ Property Validation Tab
           │      ├─ ExceptionDataValidation
           │      ├─ IndeiDataValidation
           │      └─ DataAnnotationsValidation
           │
           ├─ Commands Tab
           │      └─ StringValueCommand / Do
           │
           └─ Advanced Tab
                  └─ GenericMarkupExtension / GenericValueConverter

MainWindowViewModel
    │
    ├─ Properties
    │      ├─ StringValue
    │      ├─ DoubleValue
    │      ├─ BooleanString
    │      ├─ BooleanFlag
    │      ├─ Items (ObservableCollection)
    │      ├─ Selection (SelectionModel)
    │      └─ CurrentTime / CurrentTimeObservable
    │
    ├─ Commands
    │      ├─ ShuffleItems
    │      └─ StringValueCommand
    │
    └─ Validation ViewModels
           ├─ DataAnnotationsValidation
           ├─ ExceptionDataValidation
           └─ IndeiDataValidation
```

### データフロー図

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

TextBox入力 ───▶ Binding ───▶ ViewModel Property ───▶ 他のUIコントロール
                    │
                    └─ Mode: TwoWay/OneWay/OneTime

Collection ───▶ ItemsSource Binding ───▶ ListBox Items

Command Click ───▶ ICommand.Execute() ───▶ ViewModel Logic
                           │
                           └─ CanExecute() → IsEnabled

Validation Error ───▶ DataValidationErrors ───▶ エラー表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| MainWindow.xaml | `samples/BindingDemo/MainWindow.xaml` | ソース | 画面レイアウト定義（XAML） |
| MainWindow.xaml.cs | `samples/BindingDemo/MainWindow.xaml.cs` | ソース | コードビハインド |
| MainWindowViewModel.cs | `samples/BindingDemo/ViewModels/MainWindowViewModel.cs` | ソース | メインViewModel |
| ExceptionErrorViewModel.cs | `samples/BindingDemo/ViewModels/ExceptionErrorViewModel.cs` | ソース | 例外検証ViewModel |
| IndeiErrorViewModel.cs | `samples/BindingDemo/ViewModels/IndeiErrorViewModel.cs` | ソース | INDEI検証ViewModel |
| DataAnnotationsErrorViewModel.cs | `samples/BindingDemo/ViewModels/DataAnnotationsErrorViewModel.cs` | ソース | DataAnnotations検証ViewModel |
| TestItemView.axaml | `samples/BindingDemo/TestItemView.axaml` | ソース | 選択アイテム表示View |
