在WPF的MVVM模式中,处理对话框是更复杂的操作之一.由于您的视图模型对视图一无所知,因此对话通信很有趣.我可以公开一个ICommand,当视图调用它时,会出现一个对话框.
有没有人知道处理对话结果的好方法?我说的是关于Windows对话框,比如MessageBox.
我们这样做的方法之一是在viewmodel上有一个事件,当需要对话框时,视图会订阅该事件.
public event EventHandler<MyDeleteArgs> RequiresDeleteDialog;
Run Code Online (Sandbox Code Playgroud)
这没关系,但这意味着视图需要代码,这是我想远离的东西.
我有一个WPF应用程序,它在ViewModel中调用MessageBox.Show()方式(以检查用户是否真的要删除).这实际上是有效的,但是违背了MVVM,因为ViewModel不应该明确地确定View上发生了什么.
所以现在我在想如何在我的MVVM应用程序中最好地实现MessageBox.Show()功能,选项:
我可以收到一条短信,上面写着"你确定......?" 以及我的XAML中的边框中的两个按钮是和否全部,并在模板上创建一个触发器,使其基于名为AreYourSureDialogueBoxIsVisible的ViewModelProperty折叠/可见,然后当我需要此对话框时,将AreYourSureDialogueBoxIsVisible指定为"true" "还可以通过我的ViewModel中的DelegateCommand处理这两个按钮.
我也可以尝试用XAML中的触发器来处理这个问题,这样删除按钮实际上只会使一些Border元素出现,其中包含消息和按钮,而Yes按钮实际上是删除了.
对于曾经使用MessageBox.Show()的几行代码而言,这两种解决方案似乎都过于复杂.
您在哪些方面成功实现了MVVM应用程序中的Dialogue Box?
我创建了一个自定义messageBox窗口来替换典型的MessageBox。
我的自定义messageBox(子窗口)需要将父窗口作为参数传递。父窗口是子窗口将在指定位置(左上角,居中居中等)内作为参数的位置。
因此,当从视图模型调用我的自定义messageBox时,我需要让Window传递它。如何获得与视图模型关联的窗口?
也许使用像这里评论的接口?我正在尝试实现它,但是this.DataContext.View不存在。
我正在使用Visual Studio 2008。
ATTEMPT#1:mm8解决方案
<Window x:Class="MyNamespace.Main"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewmodel="clr-namespace:MyNamespace.ViewModels">
<Window.Resources>
<viewmodel:MainViewModel x:Key="wMainViewModel" />
</Window.Resources>
<Grid DataContext="{StaticResource wMainViewModel}">
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
考虑到我是从xaml初始化DataContext的,而不是从构造函数的代码隐藏的,所以如何将视图传递给视图模型?