EventAggregation быстрый старт? - PullRequest
       63

EventAggregation быстрый старт?

0 голосов
/ 04 апреля 2011

Я создал MainView, что его DataContext является MainViewModel, инициализированным в xaml.
MainView содержит ContentControl, который связан со свойством Content объекта MainViewModel.
Я добавил некоторый контент в конструктор MainViewModel, поэтомучто если текущий пользователь не вошел в систему, он автоматически загружает LoginView (и, соответственно, DataContext LoginViewModel) в это свойство Content.

Теперь мой вопрос заключается в том, что делать, если пользователь успешно вошел в систему:

'To be called from the LoginCommand
Private Sub Login
  'Do Login
  If WebContext.Current.User.IsAuthenticated Then
    ' - Publish a global event to be subscribed and caught from the MainViewModel
    ' - Close LoginView
    ' - The MainViewModel should set it's Content property back
    ' to what the user initially intended to open
  End If
End Sub

Как это сделать?

Примечание: я предпочитаю использовать призму EventAggregator, а не другие вещи, но понятия не имею:

  1. Как распространятьэто между ViewModels
  2. Как создавать события (мне не нужно передавать параметр, и при этом он не должен быть универсальным, просто Action, LoginAction - без параметров.
  3. Как мне подписаться из MainViewMode.
  4. Я не использую MEF или Unity, а также не использую отдельные модули, все мое приложение находится в одной сборке.y.
  5. Я предпочитаю вообще не писать никакого кода в коде
  6. Ответы в VB.NET или C # приветствуются одинаково

Любойбудет рекомендована помощь

1 Ответ

1 голос
/ 07 апреля 2011

Вы можете перейти здесь для получения информации о EventAggregator.

. Вы также можете использовать следующий код для создания экземпляра EventAggregator без использования MEF или Unity:

internal static class EventAggregatorHelper
{
  private static IEventAggregator _Current = new EventAggregator();
  public static IEventAggregator Current
  {
    get
    {
      return _Current;
    }
  }
}

И вы можете затем вызвать EventAggregator, передав таким образом необходимую информацию агрегатору:

EventAggregatorHelper.Current.GetEvent<SelectedItemChangedEvent>().
  Subscribe(HandleSelectedItemChangedEvent);

В этом случае SelectedItemChangedEvent и абонент, который имеет дело сthis event.

SelectedItemChangedEvent - это класс, объявленный, как показано ниже:

public class SelectedItemChangedEvent : CompositePresentationEvent<String>
{
} 

, и подписчик будет выглядеть примерно так:

internal void HandleSelectedItemChangedEvent(string viewName)
{
   if (!String.IsNullOrEmpty(viewName))
   {
      //Do whatever you need to do here.
   }
}

Ссылкаагрегатору событий, который я разместил в начале, он прояснит большинство вещей для вас.

Надеюсь, это поможет.

...