我已将MVVM错误消息实现为一个消息对话框,该对话框通过中介类订阅错误消息,以便其他视图模型可以在发生任何错误时通知它。
发生错误时,我将viewmodel中的visibility属性设置为Visible,以显示错误窗口。这都是在viewmodel的Error窗口中绑定的。
但是,这个窗口不是模态的!我需要将它显示为一个对话框,而不仅仅是将可见性设置为true - 即使我必须扩展窗口的功能,我还能做任何类型的绑定吗?如果我可以避免它,我宁愿不打破MVVM。
谢谢!
答案 0 :(得分:3)
View / ViewModel拆分旨在将外观与功能区分开来。我坚信Window是功能性的,并且看起来很融洽。例如,如果在ErrorMessageViewModel中,你有这个代码在有错误时执行:
class WindowViewModel : Window
{
}
.
.
.
WindowViewModel newDialog = new WindowViewModel();
newDialog.Content = myErrorListViewModel;
newDialog.Parent = mainWindowViewModel;
newDialog.ShowDialog();
因此,对话框的内容是错误列表的ViewModel。将View定义为数据模板,自动将其自身应用于错误列表ViewModel。
这看起来不像MVVM吗?
事实上,Window类是您在屏幕上看到的Window的ViewModel。通过更改Window对象的属性,它会影响“视图”,就像WindowView的属性绑定到WindowViewModel一样。唯一缺少的是能够使用WPF“重新设置”Window,并且无论你尝试实现它有多难,你都无法做到这一点。用户可以通过修改桌面主题来重新设置窗口,但是您无法控制它。您可以做的最好的事情是关闭铬和/或全屏。
答案 1 :(得分:2)
答案 2 :(得分:1)
我也在开发一个MVVM项目,我需要模态对话框或消息框。我找到了以下解决方法:
该软件仅使用一个窗口。布局根元素是没有行或列定义的网格。网格有三个孩子:
主窗口的viewmodel有一个名为Modal的成员。如果为null,则通过数据绑定和Visibility.Collapsed的转换器折叠模态使用的两个网格。
当程序想要显示例如模态消息框时,将实例化MessageBoxViewModel并将其分配给MainViewModel.Modal。 MessageBoxViewModel有一个OK按钮的命令。此命令引发一个事件,将MainViewModel.Modal再次设置为null。
面纱网格遮挡主DockPanel,因此Modal控件外的控件都不接受输入。
您的程序可以运行消息泵,直到按下OK,或者OK-Command可以触发下一个。有许多方法可以解决不同的需求,但Model-ModelView解决方案应该支持它们。
我觉得这是模态模式中的视图模型,可以为人们所希望。
答案 3 :(得分:1)
我做了一些行为,将一些模态对话框绑定到命令。
http://www.clr-namespace.com/post/MVVMModal-dialog-before-running-Command.aspx
<Confirm:Confirm IsConfirm="{Binding ElementName=checkBoxConfirm, Path=IsChecked}"
Command="{Binding Path=ButtonCommand}"
CommandParameter="{Binding ElementName=textBoxParameter, Path=Text}"
ConfirmMessage="Are you sure you want to fire the command?"
ConfirmCaption="Question" >
</Confirm:Confirm>
答案 4 :(得分:0)
在我最近的博客文章中,您可以在MVVM for Silverlight中找到Modal对话框和消息框的简单解决方案,但这可以在WPF中重复使用:
答案 5 :(得分:0)
我使用的方法与Scott Whitlock相同。
只需要设置一个重要的属性:
class ModalDialog: Window
{
}
.
.
.
var dlg = new ModalDialog {
Content = viewModelName,
**TopMost = true,**
Parent = mainWindowViewModel
};
dlg.ShowDialog();