我已经实现了我的MVVM的错误消息,订阅通过中介类错误消息的消息对话框,因此,如果发生任何错误,其他的ViewModels能够通知它。
当发生错误时,我设置的可见性属性的视图模型到可见,以显示错误窗口。 这是所有绑定从视图模型错误窗口。
然而,这个窗口是不是模态! 我需要它显示为对话而不是仅仅设置能见度为true - 是否有任何形式的结合,我可以做,即使我不得不延长窗口的功能? 我宁愿不打破MVVM如果我能避免它。
谢谢!
我已经实现了我的MVVM的错误消息,订阅通过中介类错误消息的消息对话框,因此,如果发生任何错误,其他的ViewModels能够通知它。
当发生错误时,我设置的可见性属性的视图模型到可见,以显示错误窗口。 这是所有绑定从视图模型错误窗口。
然而,这个窗口是不是模态! 我需要它显示为对话而不是仅仅设置能见度为true - 是否有任何形式的结合,我可以做,即使我不得不延长窗口的功能? 我宁愿不打破MVVM如果我能避免它。
谢谢!
查看/视图模型拆分是为了划分从功能看。 我坚信窗口是功能和外观集于一身。 举例来说,如果你的ErrorMessageViewModel,你有这个代码时出现错误,执行:
class WindowViewModel : Window
{
}
.
.
.
WindowViewModel newDialog = new WindowViewModel();
newDialog.Content = myErrorListViewModel;
newDialog.Parent = mainWindowViewModel;
newDialog.ShowDialog();
因此,对话框的内容是你的错误列表视图模型。 定义你的浏览作为自动本身适用于错误列表视图模型数据模板。
不,看起来像MVVM?
事实是,窗口类是你在屏幕上看到窗口一个ViewModel。 通过改变窗口对象的属性,它会影响“视图”一样,如果窗口视图的性能进行了绑定到WindowViewModel。 唯一缺少的是“restyle”使用WPF的窗口,它不会不管你怎么努力,以实现它的能力,你不会是能够做到这一点。 用户可以通过修改自己的桌面主题restyle一个窗口,但你控制它不是。 你能做的最好是关闭的铬和/或使全屏幕。
你会发现一个例子,如何窗口(如果他们是模态与否并不重要)所示,在这个项目中的视图模型例如:
WPF应用程序框架(WAF)
http://waf.codeplex.com
我工作,也对MVVM项目,我需要的模式dialogboxes或消息框。 我已经找到解决它的方式如下:
该软件只使用一个窗口。 布局根元素是不具有行向或columndefinitions的网格。 网格有三个孩子:
主窗口中的视图模型有一个称为模态成员。 如果这是空,两个格栅用于模态的使用是通过数据绑定和Visibility.Collapsed转换器崩溃了。
当程序要显示例如一个模式消息框,一个MessageBoxViewModel被实例化并分配给MainViewModel.Modal。 该MessageBoxViewModel有一个OK键的命令。 该命令提出,设置了MainViewModel.Modal再次空的事件。
面纱网格闭塞主DockPanel中,从而使模态外没有控制控制接受输入。
你的程序可以运行messagepump直至OK被按下,或OK命令可以触发下一个。 有解决不同需求的方法很多,但是模型的模型视图解决方案应该支持他们。
我觉得这是在模态模式可以希望视图的良好典范。
我做了一个behhavior扳平一些模式对话框的命令。
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>
在我最近的博客文章,你可以找到模态对话框和消息框在MVVM为Silverlight,但是这可以在WPF简单地重复使用简单的解决方案:
模式对话框与MVVM和Silverlight 4
我使用同样的方法,斯科特·惠特洛克。
有设置只是一个更重要的属性:
class ModalDialog: Window
{
}
.
.
.
var dlg = new ModalDialog {
Content = viewModelName,
**TopMost = true,**
Parent = mainWindowViewModel
};
dlg.ShowDialog();