かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

InteractionRequestをRxに合流させる

こねたです。

こんなのを用意しておくと捗ります。

using Microsoft.Practices.Prism.Interactivity.InteractionRequest;
using System;
using System.Reactive.Disposables;
using System.Reactive.Linq;

namespace WpfApplication7
{
    public static class InteractionRequestExtensions
    {
        public static IObservable<T> RaiseAsObservable<T>(this InteractionRequest<T> self, T n)
            where T : INotification
        {
            return Observable.Create<T>(o =>
            {
                self.Raise(n, result => o.OnNext(result));
                return Disposable.Empty;
            });
        }

    }
}

例えば、RxCommandが実行されたら確認ダイアログが出てOKが押されたときのみ何かをするといった処理が以下のように書ける!

public class MainWindowViewModel
{
    public ReactiveCommand ConfirmCommand { get; private set; }

    public InteractionRequest<Confirmation> ConfirmRequest { get; private set; }

    public MainWindowViewModel()
    {
        this.ConfirmRequest = new InteractionRequest<Confirmation>();
        this.ConfirmCommand = new ReactiveCommand();

        this.ConfirmCommand
            .SelectMany(_ => this.ConfirmRequest.RaiseAsObservable(new Confirmation
            {
                Title = "確認",
                Content = "コンテンツ"
            }))
            .Where(c => c.Confirmed)
            .Subscribe(_ =>
            {
                Debug.WriteLine("モデルのコードの呼び出し");
            });
    }
}

割といいかも