WPF MVVM疑问

6

大家好,StackOverflow用户(或者Stackoverflowers):

我正在学习WPF编程。我阅读了几篇文章/观看了几个视频,来自WEB开发背景的我启动了VS2010并开始制作一个示例应用程序,以帮助我学习基础知识。

我也读了一些关于MVVM的内容,并开始使用它。我设置了我的解决方案来使用WPF 4.0、ActiveRecord 2.1和SQLite,一切都进行得很顺利。但我仍然有一些疑问:

  • 我创建了一个MainWindowViewModel,并使用这里的RelayCommand类来绑定命令。在MVVM模式下,通过将MainWindow中的一个菜单项的命令绑定到此视图模型的属性上是否违反任何指南?

  • 我将要使用的MenuItem命令将实例化一个新的ViewModel和一个新的View,并显示它。同样,在MVVM上下文中这样做是否可以?

  • 我的MainWindow将是一个“仪表板”,并且我将会连接多个模型到这个仪表板上。我应该只在一个视图模型中包装所有这些模型吗?

像这样:

public class MainWindowViewModel {

    private ObservableCollection<Order> openOrders;
    private Address deliveryAddress;
    private Order newOrder;
    /* Wrappers for the OpenOrders Collection */
    /* Wrappers for Delivery Address */
    /* Wrappers for New Order */
    /* Command Bindings */

}

TIA!


有些人把StackOverflow上的用户称为“Stackers”。 - Eduardo Molteni
@Eduardo, wtaniguchi:请参阅 Meta 上的此讨论 - Thomas Levesque
3个回答

6
我创建了一个MainWindowViewModel,并使用来自此处的RelayCommand类来中继命令。如果我让MainWindow的菜单项绑定到此ViewModel的属性,是否违反了任何指南?
不,您并没有违反任何指南。将MenuItem绑定到MainWindowViewModel的命令是完全适当的(否则您会把这个命令放在哪里呢?)。
我要将MenuItem命令绑定到的操作将实例化一个新的ViewModel和新的View,并显示它。那么,在MVVM上下文中这样做可以吗?
当然可以创建新的ViewModel。至于创建新的视图,取决于您如何创建它......您当然不能从ViewModel显式地实例化视图,因为这会引入VM到view的依赖关系。
我的MainWindow将是一种“仪表板”,我将有多个模型附加到此仪表板上。我应该只包装所有这些模型在一个ViewModel中吗?
这取决于您对“包装”一词的定义......您的MainWindowViewModel可以通过属性公开其他ViewModel,并且这些VM将显示在视图的不同部分。如果这就是您的意思,那么是的,您应该将它们包装起来。

感谢您的回复。对于第二个答案,我在提问时也正是考虑到了这一点。假设我不会显式地调用“new SomeView();”,那么我应该如何从ViewModel中调用另一个View呢?至于第三个答案,我需要公开我需要用于视图不同部分的ViewModel,并使用UserControl + ResourceDictionary来呈现该类型,并将公开的VM绑定到它上面? - wtaniguchi
对于第二点,我通常使用ContentControl根据视图模型的类型选择适当的DataTemplate。至于第三点:是的,完全正确。 - Thomas Levesque
好的!谢谢!我现在有更好的理解了,会围绕这个问题进行思考! - wtaniguchi

3

补充Thomas的答案:

我会为仪表板的每个部分创建不同的用户控件,并为每个用户控件分配一个viewModel。


2
我创建了一个MainWindowViewModel,并使用来自此处的RelayCommand类来传递命令。将MainWindow中的MenuItem命令绑定到此viewmodel的属性上是否违反任何指南?
不,那正是您放置命令的地方。
我将菜单项命令绑定到的此操作将实例化一个新的ViewModel和一个新的View,并显示它。再次提问,在MVVM上下文中是否可以这样做?
它不应该知道如何实例化新视图;那是视图的工作。如何执行此操作的具体细节取决于您如何显示此新视图--它可以简单地在视图中具有ContentPresenter,该ContentPresenter绑定到视图模型中的属性,因此当您设置属性(并引发PropertyChanged)时,ContentPresenter使用其相关的DataTemplate呈现新对象。
如果您所说的“实例化新视图”是指“打开新窗口”,则问题会有些棘手。尤其是如果您希望新窗口是模态对话框,这种情况下没有特别优雅的方法。其中一种方法是向视图的代码后台添加事件处理程序,监听视图模型上的PropertyChanged;当下属视图模型属性设置时,视图中的代码将创建并显示新窗口。
我的MainWindow将是一种“仪表板”,我将有多个模型附加到此仪表板上。我应该只是将所有这些模型包装在单个视图模型中吗?
当然。这是一个非常常见的模式。例如,公开可观察集合属性并将某种ItemsControl绑定到它;视图将自动为您放入该集合中的每个视图模型创建视图。同样,具体实现取决于您的应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接