以下问题是基于评论在这个帖子: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