繋ぎといっても大したことはしませんが、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への委譲 });
うん、いい感じな気がしてきた。