1

我有一个带有 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();

}
4

1 回答 1

0

在这种情况下,我建议您实施DialogService。您可以将此服务注入到您的视图模型中,为了进行测试,您必须注入一个不依赖于视图的实例,从而保持可测试性。您可以使用 ViewModelLocator 使该服务可用于您的应用程序。

另一种方法是实现一个 ViewBase 类,该类实现一个允许您显示对话框的接口。ViewModel 现在使用这个接口来显示一个对话框。再次测试您需要提供不同的接口实现。可以在此处找到示例。

这两个想法都围绕着相同的概念,即分解显示对话框的功能。为了严格解耦 View 和 ViewModel,您必须考虑 ViewModel 如何指定必须删除哪个对话框,以及如何将对话结果或对话模型返回给调用 ViewModel。

哪种方法更好取决于您的判断。我个人更喜欢第一种方法,因为我不必从公共基类继承视图。

PS:使用命令到达 ViewModel 中要显示对话框的位置。使用对话服务应该不需要任何代码。

于 2011-06-28T17:27:31.380 回答