0

DataContext が xaml で初期化された MainViewModel であるという MainView を作成しました。
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

これはどのように行われますか?

注:私EventAggregatorは他のものよりもプリズムのrathenを使用することを好みますが、手がかりがありません:

  1. ViewModel 間で展開する方法
  2. イベントの作成方法 (パラメーターを渡す必要も、一般的である必要もありません。ただActionLoginActionパラメーターはありません。
  3. MainViewMode からサブスクライブするにはどうすればよいですか。
  4. MEF や Unity は使用せず、個別のモジュールも使用しません。アプリケーションはすべて 1 つのアセンブリに含まれています。
  5. コード ビハインドにコードをまったく記述しないことを好みます
  6. VB.NET または C# の両方で同じ回答を歓迎します

どんな助けもお勧めします

4

1 に答える 1

1

に関する情報については、こちらを参照してくださいEventAggregator

次のコードを使用して、EventAggregatorMEF または 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.
   }
}

最初に投稿した Event Aggregator へのリンクは、ほとんどのことを解決してくれるはずです。

お役に立てれば。

于 2011-04-07T10:13:06.800 に答える