2017-08-17 10 views
0

MVVMパターンのWPFを使用しています。私はviewmodelからウィンドウを閉じたい。私はいくつかの以前の問題の解決策を使用しようとしましたが、うまく機能しません。mvvmのビューモデルからビューを閉じるにはどうしたらいいですか?

は、ここに私のコードです:

のViewModel:

//Defining commands  
public RelayCommand SaveAddBankCommand { get; private set; } 

//Constructor 
     public AddBankVM() 
     { 
      //Initializing Commands 
      SaveAddBankCommand = new RelayCommand(SaveAddBank); 
     } 

//Commands methods 
     public void SaveAddBank(object parameter) 
     { 
      new Banks().AddBank(this.BankName, _Status, System.Convert.ToDouble(Credit), this.Notes); 
      new Done("Bank has been added successfully."); 

      //here i want to close the window. 

     } 

ビュークラス:

public partial class AddBankView : Window 
    { 
     public AddBankView() 
     { 
      InitializeComponent(); 
      var addBankVM = new AddBankVM(); 
      this.DataContext = addBankVM; 
     } 
} 
+0

これを実行する方法はたくさんあります。なぜあなたはこれをしたいのかを示すために、いくつかのコードを提供する必要があります。それから私たちはあなたを助けることができます。 – AQuirky

+0

質問を編集しました。私のコードを見ることができます。 –

+0

ViewModelにウィンドウのインスタンスがあるので、 'yourWindow.Close();'を実行してください。 – Sach

答えて

0

[OK]をクリックします。ここではそれを行うための一つの方法は次のとおりです。ビューモデルで

...初期化の背後にあるコードで

//Commands methods 
    public void SaveAddBank() 
    { 
     new Banks().AddBank(this.BankName, _Status, System.Convert.ToDouble(Credit), this.Notes); 
     new Done("Bank has been added successfully."); 

     //here i want to close the window. 
     CloseWindowEvent?.Invoke(this, EventArgs.Empty); 
    } 
    public event EventHandler CloseWindowEvent; 

...

 InitializeComponent(); 
     DataContext = new AddBankVM(); 
     (DataContext as AddBankVM).CloseWindowEvent += CommandBench_CloseWindowEvent; 

は、背後にあるコードでの最後のイベントハンドラ。 ..

private void CommandBench_CloseWindowEvent(object sender, EventArgs e) 
    { 
     Close(); 
    } 

概念的には、ビューモデルがウィンドウを閉じるためにイベントをウィンドウに送信しているということです。

私は、MVVMスタイルの警察がこのアプローチにいくつかの問題があると思われます。私たちは彼らから聞いてみましょう。

0

最も簡単な方法は、インタフェースを導入することである。

public interface IClosable 
{ 
    void Close(); 
} 

はその後、あなたはコードビハインドに変更する必要が唯一のものは、ウィンドウがIClosableを実装することを指定することです:

public partial class MainWindow : Window, IClosable 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 
} 

XAML:

<Button Width="50" 
      Height="20" 
      Command="{Binding CloseCommand}" 
      CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, 
                     AncestorType={x:Type Window}}}" 
      Content="Close" /> 

のViewModel:また

#region Commands 
    public DelegateCommand<IClosable> CloseCommand => new DelegateCommand<IClosable>(Close, CanClose); 

    private bool CanClose(IClosable parameter) 
    { 
     return true; 
    } 
    private void Close(IClosable parameter) 
    { 
     var closable = parameter as IClosable; 
     if (closable != null) 
     { 
      closable.Close(); 
     } 
    } 

は、あなたがEventTigger、または行動、または付属の振る舞いを使用することができますが、それはあまり簡単です、私見。

関連する問題