かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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への委譲
    });

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