これは愚かな疑問に思えるかもしれませんが、私はこれを尋ねる学習曲線にあります。いくつかの命令などを、 MVVMアプリケーションでWPF: How to make Calls to Dispatcher.Invoke() Synchronous?
は、我々はボタンのコマンドは、バインディングのためのICommandを定義し、別のメソッドを呼び出すことが、別のViewModelをロードしたり、実行します。実際には は、私は前の未解決の質問に代わるものを見つけようとしています。コードで
アップデート:ここで はEndViewを表示するビューモデルをロードすると、ボタンへの結合、私のICommandです:WPF:ICommandに似たメソッドを呼び出す方法は?
public ICommand EndCommand => new RelayCommand(p =>
{
WixBootstrapperData.CurrentViewModel = new EndViewModel(WixBootstrapperData);
});
しかし、私は別の方法で同じのViewModelをロードしようとしたとき、それがなかったですロードインgであるが、EndViewを一度も表示しなかったので、実際にはアプリケーション自体の最後であるメソッドの最後まで、他の命令にスキップした。ここでは、スニペットは次のとおりです。
BootstrapperApplication.ApplyComplete + =(送信者、E)=> {
WixBootstrapperData.CurrentDispatcher.Invoke((Action)(() =>
{
if (e.Restart == ApplyRestart.RestartRequired)
{
//This would be loaded, but never showed the related View and skipped to next instruction
WixBootstrapperData.CurrentViewModel = new EndViewModel(WixBootstrapperData);
}
//However, This would be loaded and related View would also be displayed
WixBootstrapperData.CurrentViewModel = new FinishViewModel(WixBootstrapperData);
}
));
}
は、我々は同じ動作を取得するために別の方法から同じのICommandを呼び出すことができますか?それとも別の方法ですか?
イベントを定義してそれをサブスクライブすると、メソッドの実行内から同じ振る舞いが得られますか?
あなたのViewModelに、あなたの 'ICommand'プロパティのコードを投稿することができます(そして、あなたの代理人を代理人に割り当てることもできます)。私は以下の答えを追加しました - しかし、私はあまりにもあなたが使用しているタイプと仮定したくありません。ありがとうございました –
あなたの質問を更新していただきありがとうございます。それはクールです、私はちょうどあなたがあなたのコマンドタイプとして 'RelayCommand'を使用していたかどうかを見たいと思っていました - 以下の私の答えを見てください。うまくいけばそれは役に立ちます:) –
'if(e.Restart == ApplyRestart.RestartRequired)'が真であるとしましょう。何が起こるのですか? 'CurrentViewModel = EndViewModel'。しかし、メソッドは引き続き実行され、現在は 'CurrentViewModel = FinishViewModel'です。私は 'if'と最後の行の間に' else'が必要だと思います。 – Will