📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| 141行目: | 141行目: | ||
<br> | <br> | ||
==== コマンドバインディング ==== | ==== コマンドバインディング ==== | ||
コマンドバインディングは、Avalonia UIにおいて、ユーザインターフェースのアクションをビジネスロジックに結びつける強力な手法である。 | |||
これは、MVVM (Model-View-ViewModel) パターンを効果的に実装するための重要な要素である。 | |||
<br> | |||
直接イベントハンドラをバインドする代わりに、コマンドを使用することもできる。<br> | 直接イベントハンドラをバインドする代わりに、コマンドを使用することもできる。<br> | ||
<br> | <br> | ||
コマンドバインディングの基本概念を以下に示す。 | |||
* 分離と再利用性 | |||
*: コマンドを使用することにより、UIの動作とビジネスロジックを分離できる。 | |||
*: これにより、同じロジックを異なるUIコントロールで再利用、あるいは、異なるビューで共有したりすることが容易になる。 | |||
*: <br> | |||
* ICommandインターフェース | |||
*: Avalonia UIでは、コマンドは<code>ICommand</code>インターフェースを実装する。 | |||
*: このインターフェースには、<code>Execute</code>メソッド (コマンドの実際の動作を定義) と <code>CanExecute</code>メソッド (コマンドが実行可能かどうかを決定) が含まれる。 | |||
*: <br> | |||
* ViewModelでの定義 | |||
*: コマンドは、ViewModelクラス内で定義される。 | |||
*: これにより、ビジネスロジックをUIから分離して、テストやメンテナンスが容易になる。 | |||
<br> | |||
以下の例では、ViewModelでのコマンドを定義している。<br> | |||
<syntaxhighlight lang="c#"> | |||
public class MainViewModel : ViewModelBase | |||
{ | |||
private ICommand _saveCommand; | |||
public ICommand SaveCommand => _saveCommand ??= new RelayCommand(ExecuteSave, CanSave); | |||
private void ExecuteSave() | |||
{ | |||
// ロジックをここに実装 | |||
} | |||
private bool CanSave() | |||
{ | |||
// コマンドが実行可能かどうかの条件をここに実装 | |||
return true; | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
以下の例では、XMLでのバインディングをしている。<br> | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
<Button Command="{Binding | <Button Content="Save" Command="{Binding SaveCommand}"/> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
コマンドバインディングのメリットを以下に示す。<br> | |||
* 自動的な有効 / 無効の切り替え | |||
*: CanExecuteメソッドの結果に基づいて、関連するUIコントロールが自動的に有効 / 無効になる。 | |||
* パラメータの受け渡し | |||
*: コマンドにパラメータを渡すことができ、より柔軟な実装が可能である。 | |||
*: <syntaxhighlight lang="xml"> | |||
<Button Content="Delete" Command="{Binding DeleteCommand}" CommandParameter="{Binding SelectedItem}"/> | |||
</syntaxhighlight> | |||
*: <br> | |||
* イベントとの統合 | |||
*: 特定のイベントをトリガーとしてコマンドを実行できる。 | |||
*: <syntaxhighlight lang="xml"> | |||
<TextBox Text="{Binding SearchText}"> | |||
<i:Interaction.Behaviors> | |||
<ia:EventTriggerBehavior EventName="TextChanged"> | |||
<ia:InvokeCommandAction Command="{Binding SearchCommand}"/> | |||
</ia:EventTriggerBehavior> | |||
</i:Interaction.Behaviors> | |||
</TextBox> | |||
</syntaxhighlight> | |||
*: <br> | |||
* テスト容易性 | |||
*: ビジネスロジックがViewModelに分離されているため、ユニットテストが容易になる。 | |||
*: <br> | |||
* コードの再利用 | |||
*: 同じコマンドを複数のコントロールやビューで使用できる。 | |||
*: <br> | |||
* 非同期操作のサポート | |||
*: ReactiveCommand等を使用することにより、非同期操作を簡単に実装できる。 | |||
*: <syntaxhighlight lang="c#"> | |||
public ReactiveCommand<Unit, Unit> LoadDataCommand { get; } | |||
public MainViewModel() | |||
{ | |||
LoadDataCommand = ReactiveCommand.CreateFromTask(LoadDataAsync); | |||
} | |||
private async Task LoadDataAsync() | |||
{ | |||
// 非同期データ読み込み処理 | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
コマンドバインディングを使用することにより、クリーンで保守性の高いコードを記述することができるため、UIとビジネスロジックの分離が促進される。<br> | |||
これは、特に大規模なアプリケーション開発において重要なメリットとなる。<br> | |||
<br> | |||
==== イベント引数の変換 ==== | ==== イベント引数の変換 ==== | ||
<code>x:Arguments</code>を使用して、イベント引数を変換または追加することができる。<br> | <code>x:Arguments</code>を使用して、イベント引数を変換または追加することができる。<br> | ||