かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

PrismとReactivePropertyのつなぎ

繋ぎといっても大したことはしませんが、InteractionRequestに対して、こんな拡張メソッド用意してればいいのかなぁ?

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

namespace WpfApplication1
{
    public static class InteractionRequestExtensions
    {
        public static IObservable<T> RaiseAsObservable<T>(this InteractionRequest<T> self, T notification)
            where T : Notification
        {
            var s = new AsyncSubject<T>();
            self.Raise(notification, t =>
            {
                s.OnNext(t);
                s.OnCompleted();
            });
            return s.AsObservable();
        }
    }
}

こういうのがあれば例えばコマンド押して選択項目の編集画面を表示してうんぬんがこんな雰囲気でかけそう。

// SelectedItemというReactivePropertyが定義されてるとして・・・
// 選択されてるときのみ実行可能なコマンド
this.EditCommand = this
    .SelectedItem
    .Select(i => i != null)
    .ToReactiveCommand(false);
this.EditCommand
    // 選択項目から編集画面用のVM作って
    .Select(_ => new EditWindowViewModel(this.SelectedItem.Value))
    // InteractionRequest経由で編集画面を表示
    .SelectMany(vm =>
        // ShowEditWindowRequestはInteractionRequest<Notification>型のプロパティ
        // XAML側でウィンドウを表示するTriggerActionと紐づけてるイメージ
        this.ShowEditWindowRequest.RaiseAsObservable(
            new Notification
            {
                Title = vm.EditTargetViewModel.Value.Name.Value + " Editing",
                Content = vm
            }))
    .Subscribe(n =>
    {
        var vm = n.Content as EditWindowViewModel;
        // 結果を受けて何なりと処理をやる
        // 主にModelへの委譲
    });

うん、いい感じな気がしてきた。