以下問題是基於評論在這個帖子:MVVM Understanding IssuesWindow.Closing事件處理程序MVVM
我說,這是隱藏代碼,這並不違反關注的視圖和視圖模型分離:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Closing += MainWindow_Closing;
}
void MainWindow_Closing(object sender, CancelEventArgs e)
{
var canExit = ViewModel.ShowConfirmExitDlg();
if (!canExit) e.Cancel = true;
}
}
的意見是:
任何在代碼隱藏不能被單元測試,並且調用所述 創建的對話框的邏輯,因此不應該在 視圖
我有兩個問題:
- 是否值得關注的問題的這種突破MVVM分離?
- 你會怎麼做(更好)?
我可以打電話給XAML中使用一些EventTriggers和CallMethod動作視圖模型的方法,但它並沒有任何區別。
我能做到使用事件聚合:
public partial class MainWindow : Window
{
private readonly IEventAggregator _eventAggregator;
public MainWindow(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
InitializeComponent();
Closing += MainWindow_Closing;
}
void MainWindow_Closing(object sender, CancelEventArgs e)
{
var evt = new MainWindowClosingEvent();
_eventAggregator.Publish(evt);
e.Cancel = evt.IsCancel;
}
}
並在視圖模型處理該事件,但它帶來什麼價值?我仍然不能單元測試取消窗戶關閉事件,但我已經介紹了出版和訂閱,這也值得單位推薦。這是間接
的另一層也許我可以路由事件視圖模型:
public MainWindow()
{
InitializeComponent();
Closing += ViewModel.OnWindowClosing;
//or
Closing += (o, e) => ViewModel.OnWindowClosing(e);
}
,但我看不出與原樣品太大的區別。
恕我直言,視圖和視圖模型之間的連接不能在視圖模型測試中unittested,所以我要麼找到一種方法如何測試觀點或它是徒勞無益的。
您是否試圖關閉您的viewmodel中的窗口,或者只是傳遞給您的viewmodel,您的窗口正在關閉? – Cameron
通常,窗口可以通過點擊X按鈕來關閉,或者按下alt + f4等。 – Liero