2015-08-31 28 views
0

今天我遇到了一些類似下面的代碼。 它非常簡單,希望你可以通讀錯誤。關閉多個模態視圖時確保正確返回

ViewHelper類,可以打開新的視圖。

public void DisplayView(ViewBase viewModel) 
{ 
    view = GetView(viewModel); 
    view.Owner = GetOwner(view); 
    view.ShowDialog(); //Will never return if view.Owner closes itself before view. 
} 

查看模型類,可以打開另一個對話框。

public class MyViewModel : ViewModelBase 
{ 
    private Action<int> _callback; 
    public int SelectedInt { get; set; } 

    public MyViewModel(Action<int> callback) 
    { 
     _callback = callback; 
    } 

    public void AcceptAndClose() 
    { 
     _callback.Invoke(SelectedInt); 
     Close(); 
    } 

    public void Close() 
    { 
     // Closes corresponding View 
    } 

    public void NewDialog() 
    { 
     var callback = p => 
     { 
      this.SelectedInt = p; 
      this.AcceptAndClose(); 
     } 
     ViewHelper.DisplayView(new MyViewModel(callback)); 
    } 
} 

,我發現它的問題是,如果我們在MyViewModel類打開與NewDialog一個新的對話框(),而新的視圖模型運行AcceptAndClose(),它永遠不會正確地關閉,因爲它的主人自行關閉通過回調之前,它做到了。

可以通過更改AcceptAndClose()函數來解決此問題,以便在調用回調之前關閉它自己。但它似乎很容易出錯。 避免這種情況發生的最佳做法是什麼?

回答

2

相信我,當我說這條道路未來會有失敗的時候。 您的viewmodel絕不應該有任何視圖的知識。

你的看法應該調用viewmodel。

它也解決了你的問題;)

+1

同意。我寫了一篇關於[MVVM對話框](http://www.codeproject.com/Articles/820324/Implementing-Dialog-Boxes-in-MVVM)的文章,其中涵蓋了相當全面的關閉問題,同時仍然易於實現應用端。基本上,你需要一個行爲,進入關閉事件並相應地調用你的回調。 –