我有一个列表页面,以图形表示方式列出记录。 点击某个图形部分或某个按钮 - 在页面上添加运行时 - 我希望通过传递一些数据作为参数来激活新页面。
EG。我有类别列表页面,UI表示在运行时完成。所以点击某个类别我想在另一个页面上列出其相关产品,我得到了它的CategoryID,
现在,我的问题是在WPF中激活/显示MVVM patern中的新页面。
就像ASP.Net中的Response.Redirect
一样提前感谢您的宝贵建议。
答案 0 :(得分:2)
这不是真正的“MVVM事情”,更多的是激活屏幕的问题。您可能需要一些维护应用程序状态或处理视图显示(也可能连接ViewModel)的总体服务,然后在show details命令中,您可以执行以下操作:
MyAppService.ShowDetails(currentID);
您可能需要查看PRISM区域系统和参考PRISM Stock应用程序以获取一些架构示例。很大程度上取决于你的UI结构,但希望它至少会给你一些想法!
答案 1 :(得分:0)
在MVVM中有两种方法可以做到这一点。我同意Steve Robbins的说法,“知道如何加载另一个屏幕并不是你的VM的责任”,但是你的VM有责任从视图中收到通知,要求显示新屏幕并通过通知将在需要时加载和卸载视图的对象。需要记住的是,每个VM都绑定到一个视图,并在显示新视图时替换VM。因此,在行政人员的性质中,其他事情需要进行替换。
这就是复合WPF(Prism)框架受到如此多关注的原因。在学习提供行政人员的Prism之前,我一直在努力解决你提出的同样问题。我假设您的类别列表正在项目控件中显示。基本上,在您的情况下,我可能会将控件的SelectedItem属性绑定到VM中的SelectedItem属性。我会让该属性的setter调用一个MVVM方法,该方法通知Prism框架选择,并传递传递给属性setter的SelectedItem。我会使用Prism加载带有需要显示的页面的模块。
Prism的优点在于,如果您希望“产品”页面替换“类别”页面,它将起作用,如果您希望在同一窗口中的“类别”窗格旁边显示“产品”窗格,它也会起作用。在设置Shell(主窗口)时指定一个或两个区域是一件简单的事。
Prism有一个学习曲线,但它不是很陡峭。它适用于MVVM,对于任何可以从分区中受益的应用程序来说,它都是一个很好的框架。我认为它是WPF应用程序设计的关键元素。
答案 2 :(得分:0)
我正在考虑使用后面的代码来处理导航和数据操作的命令,区别在于:如果它触及数据库并且它必须是可测试的,那么它必须是VM中的ICommand,如果它是导航它必须是代码背后。 我知道应用程序设计应尽量不混合操作,但这并不总是可行。