MVVMLightの基本的な使用方法

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");

タグ: MVVM MVVMLight WPF RelayCommand Messenger

7月18日 23:12 投稿