2011-08-25 103 views

回答

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引发事件。 模块B中的控制器注册并响应事件。 模块B中的控制器将子窗口服务作为依赖关系。 当事件发生时,控制器将在模块B中创建VM并将参数传递给它,从事件中,它也将使用服务来显示一个ChildWindow。

+0

你可以发布ChildWindowService的代码吗?我想我有你的其他观点。 – Prazanna

+0

@Prazanna为子窗口添加代码 – Agies