はじめに
オレオレ解釈の覚書 その13
Livet に用意された相互作用処理のため実装である Messanger についてまとめます。
本文
前回の最後に紹介させて頂きましたが、Livet は Prism と同じく MVVM フレームワークの一つです。
Livet には Messanger と呼ばれる機構が用意されており、View を直接参照することなく ViewModel から相互作用処理を依頼することができます。
Prism 7.2 で廃止されてしまった InteractionRequest の代替としてこちらを利用してみます。
Messanger と InteractionRequest とでは実装方法が異なります。Messanger はインスタンス自体は一つで、ViewModel から通知を行う際に指定する MessageKey によって処理の違いを表現します。View は Messanger をバインドして MessageKey の値を指定することで、通知をハンドルし相互作用処理を実行します。
InteractionRequest と比較すると、Messanger はインスタンス数を抑えられるため実装がスッキリしています。一方で MessageKey を文字列で指定する必要があり、この辺りは好みが分かれるかもしれません。
using Livet.Messaging;
namespace TestApp.ViewModels
{
public class MainWindowViewModel
{
public InteractionMessenger Messanger { get; }
public MainWindowviewModel()
{
this.Messenger = new InteractionMessenger();
}
public void ShowMessage()
{
this.Messenger.Raise(new InteractionMessage("ShowMessage"));
}
}
}
<Window x:Class="TestApp.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:p="http://prismlibrary.com/"
xmlns:behaviors="clr-namespace:TestApp.Views.Behaviors"
p:ViewModelLocator.AutoWireViewModel="True">
<i:Interaction.Triggers>
<l:InteractionMessageTrigger MessageKey="ShowMessage" Messenger="{Binding Messenger, Mode=OneWay}">
<behaviors:MessageAction/>
</l:InteractionMessageTrigger>
</i:Interaction.Triggers>
</Window>
おわりに
Livet の Messager についてのお話でした。
InteractionRequest と同じく非常に汎用性の高い仕組みであり、MVVM パターンによる開発を強力にサポートしてくれるはずです。