2016-10-27 8 views
1

私はWPF、MVVM、PrismとUnityでアプリケーションを作成します。 1つのウィンドウのから私は、二次ウィンドウを起動します。BTMPrescriptionViewModelでWPF&MVVM:CloseActionは機能しません。

public void ShowForm(IPrescriptionViewModel viewModel) 
    { 
     var view = new PrescriptionForm(); 
     view.SetDataContext(viewModel); 
     view.ShowDialog(); 
    } 

方法SetDataContext

public void SetDataContext(IPrescriptionViewModel viewModel) 
    { 
     if (viewModel == null) return; 
     DataContext = viewModel; 
     if (viewModel.CloseAction == null) 
      viewModel.CloseAction = new Action(this.Close); 
    } 

をプロパティ

public Action CloseAction { get; set; } 

とCloseCommandExecute

public ICommand CloseCommand => new RelayCommand(CloseCommandExecute); 

    private void CloseCommandExecute() 
    { 
     CloseAction(); 
    } 

ことですうまく動作しますが、一度だけ - 最初のものです。セカンダリウィンドウを閉じてもう一度開くと、ウィンドウの閉じるボタンでのみ、コマンドボタンで閉じなくなりました。親ウィンドウを閉じて開いた後に、セカンダリウィンドウをコマンドボタンでもう一度閉じることができますが、もう一度一度しか閉じることはできません。

答えて

2

問題が確実に再現されていないと、問題が何であるかを確かめることは不可能です。しかし、ここに投稿したコードに基づいて、毎回新しいウィンドウを作成していますが、一度だけCloseActionプロパティを設定するように見えます。

あなたがClose()メソッドを呼び出すためにキャプチャthisを割り当てるCloseActionデリゲート値ので、それは常にあなたが後で作成のもののいずれか、最初に作成したウィンドウでClose()がない呼んでいます。

コード例が完全ではない場合、目標を達成するための最良の方法は何かが明確ではありません。あなたはまた、明示的にデリゲートコンストラクタを呼び出す必要はありません

public void SetDataContext(IPrescriptionViewModel viewModel) 
{ 
    if (viewModel == null) return; 
    DataContext = viewModel; 
    viewModel.CloseAction = this.Close; 
} 

注:あなただけのヌルチェックアウトを取り、常に値を割り当てられている場合でも、基本的な問題はおそらく解決されるだろう。コンパイラには、デリゲート型を扱うための推論規則があり、単にメソッド名を参照するだけで十分です。

+0

ありがとうございました。今はすべて正常に動作します – SergS

関連する問題