【发布时间】:2015-08-27 15:21:22
【问题描述】:
以下问题基于此帖子中的评论:MVVM Understanding Issues
我说这是代码隐藏,不违反视图和视图模型的关注点分离:
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;
}
}
cmets 是:
代码隐藏中的任何内容都不能进行单元测试,并且调用 对话框的创建是合乎逻辑的,因此不应该在 查看
我有两个问题:
- 这会破坏 MVVM 的 conern 分离吗?
- 你会怎么做(更好)?
我可以使用一些 EventTriggers 和 CallMethod 操作从 xaml 调用 viewmodel 方法,但这没有任何区别。
我可以使用事件聚合器:
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);
}
但我看不出与原始样本有太大区别。
恕我直言,视图和视图模型之间的连接无法在视图模型测试中进行单元测试,所以我要么找到一种方法来测试视图,要么就是胡闹。
【问题讨论】:
-
您是想从您的视图模型中关闭窗口,还是只是将您的窗口正在关闭的视图模型传递给您?
-
通常可以通过点击X按钮,或者按alt+f4等来关闭窗口