0

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

这是怎么做到的?

注意:我更喜欢使用棱镜的EventAggregatorrathen然后其他东西,但我不知道:

  1. 如何在 ViewModel 之间展开
  2. 如何创建事件(我不需要传递参数,也不需要它是通用的,只是ActionLoginAction- 没有参数。
  3. 如何从 MainViewMode 订阅。
  4. 我不使用 MEF 或 Unity,也不使用单独的模块,我的所有应用程序都在一个程序集中。
  5. 我根本不喜欢在代码隐藏中编写任何代码
  6. VB.NET 或 C# 中的答案都欢迎相同

任何帮助都会被推荐

4

1 回答 1

1

你可以去这里了解有关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,处理此事件的订阅者。

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

public class SelectedItemChangedEvent : CompositePresentationEvent<String>
{
} 

订阅者将是这样的:

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

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

希望这可以帮助。

于 2011-04-07T10:13:06.800 回答