2016-10-20 4 views
0

これは愚かな疑問に思えるかもしれませんが、私はこれを尋ねる学習曲線にあります。いくつかの命令などを、 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を呼び出すことができますか?それとも別の方法ですか?

イベントを定義してそれをサブスクライブすると、メソッドの実行内から同じ振る舞いが得られますか?

+0

あなたのViewModelに、あなたの 'ICommand'プロパティのコードを投稿することができます(そして、あなたの代理人を代理人に割り当てることもできます)。私は以下の答えを追加しました - しかし、私はあまりにもあなたが使用しているタイプと仮定したくありません。ありがとうございました –

+0

あなたの質問を更新していただきありがとうございます。それはクールです、私はちょうどあなたがあなたのコマンドタイプとして 'RelayCommand'を使用していたかどうかを見たいと思っていました - 以下の私の答えを見てください。うまくいけばそれは役に立ちます:) –

+0

'if(e.Restart == ApplyRestart.RestartRequired)'が真であるとしましょう。何が起こるのですか? 'CurrentViewModel = EndViewModel'。しかし、メソッドは引き続き実行され、現在は 'CurrentViewModel = FinishViewModel'です。私は 'if'と最後の行の間に' else'が必要だと思います。 – Will

答えて

2

別の方法でコマンドを実行できます。あなたが実際にcommnadを実行することができるなら、あなたはそのコマンドに.Execute()を呼び出すことができbool

を返す - まず、コマンドかどうかを確認することをお勧めし

.CanExecute()を使用することによって、実行することができます。


例:

のは、あなたのICommandRelayCommandで、MyCommandと呼ばれるとしましょう。

あなたはSomeOtherMethod()からそれを呼び出したいとしましょう:あなたはDelegateCommandを使用している場合

public RelayCommand MyCommand { get; set; } 

public void SomeOtherMethod() 
{ 
    if (MyCommand.CanExecute()) 
    { 
     MyCommand.Execute(); 
    } 
} 

同じ方法は、同様に、利用可能です - 私は、プリズムを使用して、これらを使用します。

希望すると便利です。 :)

+0

私はこれを試してみるつもりです... –

+0

ありがとう@FarrukhWaheed - あなたがどうやったらどうなるか教えてください:) –

+0

はい、問題なく実行されましたが、動作は同じでした。 MyCommand.Execute(これは)EndViewは表示されず、FinishViewは表示されませんでした。 –

関連する問題