WPF MVVM对话框示例

Oll*_*Oll 28 wpf prism mvvm mediator prism-2

有没有人有任何使用MVVM(Prism)显示窗口对话框的例子? - 例如,执行命令时的配置设置窗口.

我见过的所有例子都使用了很好的中介模式,但是他们也都在视图模型中引用了一个不理想的视图(我们使用的是DataTemplates)

谢谢

Cam*_*and 23

我会使用服务来显示对话框.然后,该服务还可以将视图与视图模型链接.

public interface IDialogService {
    void RegisterView<TView, TViewModel>() where TViewModel:IDialogViewModel;
    bool? ShowDialog(IDialogViewModel viewModel);
}

public interface IDialogViewModel {
    bool CanClose();
    void Close();
}
Run Code Online (Sandbox Code Playgroud)


RegisterView只是将视图类型与ViewModel类型链接起来.您可以在模块初始化中设置这些链接.这比尝试让模块在应用程序的顶层注册datatemplates更简单.

ShowDialog显示要显示的ViewModel.它返回true,false和null,就像Window.ShowDialog方法一样.该实现只是TView从容器中创建一个新的类型视图,将其连接到提供的ViewModel,并显示它.

IDialogViewModel 为ViewModel提供了一种机制,可以进行验证并取消关闭对话框.

我有一个标准的对话窗口,里面有一个内容控件.当ShowDialog被调用它会创建一个新的标准对话框,添加视图到内容控制,挂接视图模型,并将其显示.标准对话框已经有[OK]和[Cancel]按钮,并带有适当的逻辑来调用正确的方法IDialogViewModel.


Gro*_*kys 13

我这样做的方法是使用中介模式.当ViewModel想要显示一个对话框时,它会发送一条消息,该消息由应用程序的主窗口拾取.该消息包含对话框使用的ViewModel的实例.

然后,主窗口构造对话框窗口的实例,将视图模型传递给它并显示对话框.对话框的结果将传递回原始消息中的调用者.

它看起来像这样:

在您的视图模型中:

DialogViewModel viewModel = new DialogViewModel(...);
ShowDialogMessage message = new ShowDialogMessage(viewModel);

_messenger.Broadcast(message);

if (message.Result == true)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

在主窗口中代码隐藏:

void RecieveShowDialogMessage(ShowDialogMessage message)
{
    DialogWindow w = new DialogWindow();
    w.DataContext = message.ViewModel;
    message.Result = w.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

我希望这足以让你有这个想法......