Silverlight 4.0 使用MVVMLight显示RadDialog窗口

Silverlight 4.0 使用MVVMLight显示RadDialog窗口,silverlight-4.0,mvvm,mvvm-light,childwindow,Silverlight 4.0,Mvvm,Mvvm Light,Childwindow,我有一个功能性MVVM模式的SL应用程序,带有一个RadWindow(本质上是一个ChildWindow),我想删除视图中使用ShowDialog显示窗口的代码。如果有帮助,主视图和窗口都绑定到同一个ViewModel 该按钮具有ViewModel命令(使用MVVMLight RelayCommand处理设置状态)和视图中的事件处理程序 最终的解决方案/模式将被重复使用20多次,因此比代码隐藏更好的东西会更好 想法 private void Button_Click(object sender,

我有一个功能性MVVM模式的SL应用程序,带有一个RadWindow(本质上是一个ChildWindow),我想删除视图中使用ShowDialog显示窗口的代码。如果有帮助,主视图和窗口都绑定到同一个ViewModel

该按钮具有ViewModel命令(使用MVVMLight RelayCommand处理设置状态)和视图中的事件处理程序

最终的解决方案/模式将被重复使用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();

}
private void按钮\u单击(对象发送者,System.Windows.RoutedEventArgs e)
{
var window=new RadWindowTest.Controls.ChildWindow1();
window.Closed+=新的System.EventHandler(window\u Closed);
ShowDialog();
}

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

另一种方法是实现一个ViewBase类,该类实现一个允许您显示对话框的接口。ViewModel现在使用此界面显示对话框。同样,为了进行测试,您需要提供不同的接口实现。可以找到一个样本

这两个想法都围绕着相同的概念,即分解显示对话框的函数。为了严格分离视图和ViewModel,您必须考虑ViewModel如何指定必须亮起的对话框,以及如何将对话框resut或对话框模型返回到调用的ViewModel

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


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

太棒了,谢谢。您是否认为MVVMLight消息也可以使用,或者DialogService更纯粹(不可知)?显然您可以,但由于它是您显示的子窗口,我相信调用方法更合适。此外,发送消息是一种广播,您不知道谁会对此作出反应。如果你不小心的话,你可能会弹出多个对话框。我很感谢你的讨论,我会按照你的建议去做。那太完美了,我实现了一个修改过的DialogService,它看起来很好,工作也很好。非常感谢。