我正在寻找一个wpf项目的小例子,其中包含在视图之间导航的最佳实践。也许使用框架MVVM Light和NavigationService或ServiceLocator。而不是从ViewModel调用View,你是如何做到的?你的方法怎么样?你有项目的例子吗?
答案 0 :(得分:2)
我更喜欢ViewModel的第一种方法。这意味着导航服务将viewmodel作为参数,然后根据命名约定创建视图实例并将其加载到框架中。
navigationService.Navigate<SomePageViewModel>()
与基于URI的导航相比,这有一些优势,这是第一种方法:
不幸的是,我现在不能给你我的示例项目,但实现你自己很容易
答案 1 :(得分:1)
我赞成的一种方法是拥有一个带有内容控件的主窗口。其后面是一个视图模型,它具有基于共享枚举的应用程序状态属性。
枚举旨在表示当前状态,但如果更容易,则将每个状态视为要显示的视图。
使用绑定到此属性的模板选择器,我控制主窗口上内容控件中显示的视图。
此方法要求您管理模板选择器,其中包含要作为主要内容的每个枚举值或视图的模板属性。但模板只需要包含一个视图实例,所以最小XAML。
在后台,我使用MVVM light来提供Viewmodel定位器数据源,使我的视图很容易实例化。它们还使用单例视图模型,因此在两次使用之间管理状态。然后我还使用消息框架将消息发送到我的主窗口视图模型,告诉它我现在想要的状态。这意味着任何viewmodel都可以发布消息以切换到另一个状态,而不知道将是什么视图,但最终主窗口视图模型将管理该转换。
对于此处缺少代码示例的抱歉,这是我已多次做过的事情的大纲,但我没有一个干净的样本可供分享。
希望足以解释我的方法,但如果这没有意义或适合你想做的事情,请随时发表评论。
对于对话框...通常我会重复使用默认对话框,但可以使用相同的原则。除了作为主窗口控件和VM之外,还有一个用于对话框的辅助对象,它们的工作方式相同但是按要求可见,并在完成后自行关闭。 mvvm light messenger再次成为你的朋友。
您的消息包含控制所显示视图的对话框“状态”。
仅当您的设计一次只允许一个对话框时,这才有效。
最后,对于标签...
我将在主视图模型中查看状态枚举的可观察集合。然后通过绑定到它来构建选项卡。不是我做过的事,但那是我开始的地方。 -