Silverlight と PRISM で、別のモジュールの ViewModel からパラメーターを渡すことによって、1 つのモジュールにあるポップアップ子ウィンドウを開く良い方法は何ですか。
1409 次
1 に答える
1
IChildWindowService と呼ばれる、両方のモジュールで認識される共通のインターフェイス/クラスを作成し、ブートストラップに IChildWindowServe/ChildWindowService を登録します。
//Highly simplified version
//Can be improved by window reuse, parameter options, stronger eventing
public class ChildWindowService : IChildWindowService
{
public ChildWindowService(IServiceLocator container)
{
_container = container;
}
public void Show<TViewModel>(TViewModel viewModel = null, Action<TViewModel, bool?> callBack = null) where TViewModel is IViewModel
{
var viewName = typeof(TViewModel).Name.Replace("Model", string.Empty);
// In bootstrapper register all instances of IView or register each view one by one
var view = _container.GetInstance<IView>(viewName);
viewModel = viewModel ?? _container.GetInstance<TViewModel>();
view.DataContext = viewModel;
var window = new ChildWindow();
window.Content = view;
var handler = (s,e) => { window.Close(); }
viewModel.RequestClose += handler;
view.Closed += (s,e) => { viewModel.RequestClose -= handler; }
// In silverlight all windows show as Modal, if you are using a third party you can make a decision here
window.Show();
}
}
共通の CompositePresentationEvent を作成します。このイベントは、パラメータをポイント a からポイント b に渡します。
public class OpenChildWindowWithParameters : CompositePresentationEvent<ParamEventArgs>{}
モジュール A の ViewModel がイベントを発生させます。モジュール B のコントローラは、イベントを登録して反応します。モジュール B のコントローラーは、子ウィンドウ サービスを依存関係として受け取ります。イベントが発生すると、コントローラーはモジュール B で VM を作成し、イベントからパラメーターを渡します。また、サービスを使用して ChildWindow を表示します。
于 2011-08-25T11:04:09.137 に答える