私は2つの方法のこのいずれかを実行します。
は、ログインウィンドウは、アプリケーションを起動する前に必要な1回限りのものであれば、私はApplication
オブジェクトのOnStartup()
方法でそれを置く
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// Login
var login = new LoginDialog();
var loginVm = new LoginViewModel();
login.DataContext = loginVm;
login.ShowDialog();
if (!login.DialogResult.GetValueOrDefault())
{
// Error is handled in login class, not here
Environment.Exit(0);
}
// If login is successful, show main application
var app = new ShellView();
var appModel = new ShellViewModel();
app.DataContext = viewModel;
app.Show();
}
私が通常これを行う他の方法は、すべての私のウィンドウ管理を処理するShellViewModel
またはApplicationViewModel
です。この方法では、DataTemplates
を使用して各画面を定義し、ShellView
またはApplicationView
の現在の画面のプレースホルダとしてContentControl
を使用します。
私は通常、Microsoft PrismのEventAggregator
のような種類のイベントシステムと組み合わせて、OpenWindow
やCloseWindow
などの特定の種類のメッセージを聴くことができます。興味があれば、私はCommunication between ViewModelsについてのブログ記事を持っています。これはあなたにイベントシステムがどのように見えるかをよりよく理解させるはずです。
は例えば、私のShellViewModel
は(LoginView
とLoginViewModel
を描画するためにWPFを指示するために使用されDataTemplate
)LoginViewModel
を表示することにより開始する可能性があります、それはタイプSuccessfulLogin
のメッセージを受信するためにサブスクライブします。 LoginViewModel
がSuccessfulLogin
メッセージをブロードキャストすると、ShellViewModel
はLoginViewModel
を閉じてApplicationViewModel
に置き換えます。あなたは私の記事でこれの例を見ることができますNavigation with MVVM
これはそれを達成するための良い方法のようです。ビューモデルではなく、この機能をコードの背後に置くのに問題はありませんか? – benjgorman
@benjgorman MVVMデザインパターンは、UIコードとアプリケーションコードを別々に保つことを目的としています。UIとアプリケーションオブジェクトの両方を初期化する必要があるため、 'Application'クラスの背後にあるコードは、アプリケーションを起動します。正直なところ、私のアプリケーションでは1つ以上のウィンドウを持つことはめったにありません。私は、現在のコンテンツを管理するために 'DataTemplates'と' ContentControls'を使うことを好みます。あなたはこれの例を見ることができます[ここ](http://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/) – Rachel
あなたの答えでは、この部分は頭痛を引き起こしています。 'if(!login.DialogResult。GetValueOrDefault()) { //エラーはログインクラスで処理されますが、ここでは処理されません。 Environment.Exit(0); } ' これをICommandにどのようにバインドしますか? IPropertyChangedEventを使ってみましたが、ログインボックスが表示される前に起動します。 – benjgorman