EventAggregation快速入门?

时间:2011-04-03 23:16:52

标签: silverlight-4.0 mvvm navigation prism eventaggregator

我创建了一个MainView,它的DataContext是在xaml中初始化的MainViewModel。
MainView包含一个ContentControl,它绑定到MainViewModel的Content属性 我在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

这是怎么做到的?

注意:我更喜欢使用prism的EventAggregator rathen然后其他东西,但我不知道:

  1. 如何在ViewModels之间展开
  2. 如何创建事件(我不需要传递参数,也不需要它是通用的,仅ActionLoginAction - 没有参数。
  3. 如何从MainViewMode订阅。
  4. 我不使用MEF或Unity,也不使用分离的模块,我的所有应用程序都在一个组件中。
  5. 我不想在代码隐藏中编写任何代码
  6. VB.NET或C#中的答案都是相同的
  7. 建议任何帮助

1 个答案:

答案 0 :(得分:1)

您可以here查看有关EventAggregator

的信息

您还可以使用以下代码在不使用MEF或Unity的情况下创建EventAggregator的实例:

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和处理此事件的订阅者。

SelectedItemChangedEvent是一个声明如下所示的类:

public class SelectedItemChangedEvent : CompositePresentationEvent<String>
{
} 

订阅者将是这样的:

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

我在开始时发布的事件聚合器的链接应该清除大部分内容。

希望这有帮助。