1. MVVM パターン
UI:
<StackPanel>
<TextBox Margin="10" Height="20" Background="LightCyan" x:Name="inputText"/>
<TextBox Margin="10,0" Height="20" Background="LightCyan" Text="{Binding DisplayText}"/>
<Button Content="Button" Margin="10" Command="{Binding UpdateCommand}" CommandParameter="{Binding ElementName=inputText, Path=Text}"/>
</StackPanel>
ViewModel:
class MainViewModel : ViewModelBase
{
private string displayText;
public string DisplayText
{
get { return displayText; }
set
{
displayText = value;
this.RaisePropertyChanged();
}
}
// パラメータ付きコマンド
public RelayCommand<string> UpdateCommand { get; set; }
public MainViewModel()
{
UpdateCommand = new RelayCommand<string>(UpdateText);
}
private void UpdateText(string text)
{
DisplayText = text;
}
}
2. Messengerによるメッセージ伝達
Messengerは軽量で使いやすいメッセージ伝達機構であり、ViewModelとViewの依存関係を解消し、コードの保守性とテスト性を向上させることができます。
/// <summary>
/// サブスクライブイベントの登録(特定のメッセージに対する処理方法をViewまたはViewModelで登録)
/// </summary>
/// <typeparam name="TMessage">パラメータの型</typeparam>
/// <param name="recipient">サブスクライバインスタンス</param>
/// <param name="token">送受信で定義されたキー値</param>
/// <param name="action">サブスクライブイベントがトリガーされるアクション</param>
/// <param name="keepTargetAlive">インスタンスが存在し続けるように制御し、ガベージコレクションから削除されないようにする</param>
public void Register<TMessage>(object recipient, object token, Action<TMessage> action, bool keepTargetAlive = false);
/// <summary>
/// サブスクライブイベントの解除(特定のメッセージに対する処理方法の登録をViewまたはViewModelでキャンセル)
/// </summary>
/// <typeparam name="TMessage">パラメータの型</typeparam>
/// <param name="recipient">サブスクライバインスタンス</param>
/// <param name="token">送受信で定義されたキー値</param>
void Unregister<TMessage>(object recipient, object token);
/// <summary>
/// サブスクライバにイベントを発火(ViewModelでメッセージを送信し、そのメッセージを登録しているすべてのレシーバーに送信)
/// </summary>
/// <typeparam name="TMessage">パラメータの型</typeparam>
/// <param name="message">パラメータデータ</param>
/// <param name="token">キー</param>
public void Send<TMessage>(TMessage message, object token);
メッセージの登録:
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainViewModel();
Messenger.Default.Register<string>(this, "token1", (info) => { MessageBox.Show(info); });
}
メッセージの送信:
private void UpdateText(string text)
{
DisplayText = text;
Messenger.Default.Send<string>("こんにちは", "token1");
}
メッセージの解除:
Messenger.Default.Unregister<string>(this, "token1");