我有一个带有RadWindow(本质上是ChildWindow)的功能性MVVM图案SL应用程序,我想在我的视图中删除使用其ShowDialog显示窗口的代码隐藏。如果有帮助,主视图和窗口都绑定到同一个ViewModel。
该按钮具有一个使用MVVMLight RelayCommand的ViewModel命令来处理设置状态以及视图中的事件处理程序。
最终的解决方案/模式将被重复使用20次以上,所以比代码隐藏更好的东西会很棒。
思想?
private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
var window = new RadWindowTest.Controls.ChildWindow1();
window.Closed += new System.EventHandler<Telerik.Windows.Controls.WindowClosedEventArgs>(window_Closed);
window.ShowDialog();
}
答案 0 :(得分:0)
在这种情况下,我建议您实施DialogService。您可以将此服务注入到视图模型中,为了进行测试,您必须注入一个不依赖于视图的实例,从而保持可测试性。您可以使用ViewModelLocator为您的应用程序提供此服务。
另一种方法是实现一个ViewBase类,该类实现一个允许您显示对话框的接口。此接口现在由ViewModel用于显示对话框。再次测试您需要提供不同的接口实现。可以找到一个示例here。
这两个想法都围绕着分解显示对话框的功能的相同概念。为了严格地分离View和ViewModel,你必须考虑ViewModel如何指定哪个对话框必须被shoen,以及如何将对话框resut或对话框模型返回给调用的ViewModel。
哪种方法更好,对你的判断是开放的。我个人更喜欢第一种方法,因为我不必从公共基类继承视图。
PS:使用命令到达ViewModel中要显示对话框的位置。使用对话服务不需要后面的代码。