Призма MVVM - Как передать IEventAggregator моей ViewModel - PullRequest
0 голосов
/ 23 февраля 2011

недавно я начал работать с Prism в Silverlight. Я хочу использовать EventAggregator для подписки и публикации событий между двумя моделями представления. Как я видел в некоторых руководствах, ctor ViewModel должен принимать IEventAggregator в качестве параметра. Я не могу узнать, как это сделать, поэтому мой View всегда хочет инициализировать ViewModel ctor без параметров.

Мой ViewModel ctor:

MyViewModel(IEventAggregator eventAggregator)
{
    // get the event....
}

My View:

<UserControl ....>

    <UserControl.Resources>
        <ViewModels:MyViewModel x:Key="MyViewModel"/>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MyViewModel}}">
    ....
    <Grid/>

</UserControl>

Я могу создать экземпляр ViewModel в ctor View, а затем назначить его его DataContext, но тогда у меня должен быть IEventAggregator в моем View, который я также не могу получить. но это, вероятно, неправильный способ передачи IEventAggregator (или любого другого объекта! - например, IUnityContainer) в ViewModel.

Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 23 февраля 2011

Вы должны разрешить свою зависимость через единство. Посмотрите на примеры призмы MVVM и состав пользовательского интерфейса. Там представление не создает модель представления, но это наоборот. Модель представления получает представление, внедренное через внедрение конструктора. Модель представления устанавливает себя как модель представления для представления:

public interface IView
{
    IViewModel ViewModel{get;set;}
}

public interface IViewModel { }

public View:UserControl, IView
{
    public IViewModel ViewModel
    {
        get{return DataContext as IViewModel;}
        set{DataContext = value;}
    }
}

public ViewModel:IViewModel
{
    public ViewModel(IView view, IEventAggregator eventAggregator)
    {
        view.ViewModel = this;
        //get the event...
    }
}

Используя этот подход, вы должны зарегистрировать модель представления и представление в единстве. После этого вам нужно только разрешить модель представления, представление внедряется контейнером.

Чтобы получить представление в нужном месте пользовательского интерфейса, необходимо зарегистрировать представление в регионе с помощью RegionManager. Когда все это настроено, создание нового экземпляра модели представления приводит к добавлению представления в зарегистрированную область, чтобы оно отображалось в пользовательском интерфейсе.

1 голос
/ 23 февраля 2011

Кроме того, что ViewModel сам подключается к контексту данных представления (что мне совсем не нравится), есть два других варианта, которые я могу придумать в Silverlight.

  1. Используйте шаблон ServiceLocator, чтобы позволить вашим статическим ресурсам создавать себя через контейнер. MVVMLight имеет довольно хороший шаблон для этого.
  2. Используйте каркас, такой как Caliburn.Micro , который включает хороший набор соглашений, которые соединят многие вещи на основепо соглашениям об именах, включая привязки и модели представления.
0 голосов
/ 18 марта 2011

Возможно, вы уже решили это, но

http://www.emileinarsson.se/silverlight-4-mvvm-prism-unity-dependency-injection/

В этом посте объясняется, как использовать Unity в среде MVVM.

...