0

ユーザーが正しいパスワードを入力すると、ログイン ウィンドウが閉じ、メイン ウィンドウが開きます。ViewModel からこれを実行したいのですが、ViewModel はビューについて何も知らない可能性があります。

私はたくさん検索しましたが、明らかに最善の方法はメディエーターパターンを使用することです。このパターンがどのように機能するかは理解していますが、この場合、それを効果的に使用するにはどうすればよいですか?

メディエーターには次が必要です。
- ビューへの参照 - ビュー
モデルへの参照

ViewModel にはメディエーターへの参照が必要です。

メディエータはどこで作成する必要がありますか? ビューへの参照を設定できないため、ViewModel では実行できません。ViewModel を DataContext プロパティから取得できるため、ビューでメディエーターを作成することもできますが、それでもメディエーターを ViewModel に渡す必要があり、コードが難しくなります。

ウィンドウの開閉にメディエーターを適切に使用するにはどうすればよいですか?

4

1 に答える 1

1

メディエーター パターンは、ビューとビューモデルの間ではなく、ビューモデル間の通信に使用されます。

ビューモデルからダイアログを処理したい場合は、このようなダイアログ サービスを使用できます。

それでも、アプリケーションのログインダイアログを作成したいときは、このようにします。

app.xaml.cs で OnStartup()

  • ログインビューを作成する
  • ログイン ビューモデルを作成する
  • loginview の datacontext を loginviewmodel に設定します
  • ログインビューを表示
  • 編集: loginviewmodel はパスワードなどを確認します。OK の場合、IsValidUser=true などの状態が loginviewmodel に設定されます。
  • チェック結果
  • 編集: dialogresult == "OK" および IsValidUser=true の場合
  • 開いているメインウィンドウ

ここに私のコードのいくつか

    protected override void OnStartup(StartupEventArgs e)
    {
        //...
        ShutdownMode = ShutdownMode.OnExplicitShutdown;
        var vm = new LoginVM();
        var loginwindow = new LoginWindow();
        loginwindow.DataContext = vm;

        if (!result.HasValue || !result.Value || !IsValidUser)
        {
             Shutdown();
             return;
        }   

        //...
        var mainWindow = new MainWindow(new MainWindowViewModel(vm.Settings));

        mainWindow.Loaded += (sender, args) => splashScreen.Close();
        this.MainWindow = mainWindow;
        ShutdownMode = ShutdownMode.OnMainWindowClose;
        this.MainWindow.Show();

 }

ps: これは、ビューを最初に使用するアプリの唯一の部分です。残りは最初にすべてビューモデルです。これは、mvvm を実行するときにはるかに簡単です。

于 2012-06-20T12:40:10.617 に答える