Всплывающее окно в Silverlight 4 и Prism - PullRequest
0 голосов
/ 25 августа 2011

В Silverlight и PRISM, каков хороший способ открыть всплывающее дочернее окно, которое находится в одном модуле, путем передачи параметра из ViewModel в другой модуль.

1 Ответ

1 голос
/ 25 августа 2011

Создайте общий интерфейс / класс, известный обоим модулям, под названием 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>{}

ViewModel в модуле A вызывает событие. Контроллер в модуле B регистрируется и реагирует на событие. Контроллер в модуле B принимает дочернюю оконную службу как зависимость. Когда событие инициируется, Контроллер создаст виртуальную машину в модуле B и передаст ей параметры из события, он также будет использовать службу для отображения ChildWindow.

...