2010-09-20 91 views
6

你好老乡StackOverflow的用户(或Stackoverflowers):WPF MVVM惑

我边学边编码WPF。我阅读了几篇文章/看到了几个截屏视频,并且来自WEB开发背景,我启动了VS2010,并开始做一个示例应用程序,帮助我学习基础知识。

我也读了一些关于MVVM的知识,并开始使用它。我建立了我的解决方案来使用WPF 4.0,ActiveRecord 2.1和SQLite,并且一切都很顺利。但我也有疑问:

  • 我创建了一个MainWindowViewModel,和现在用的是RelayCommand类从here到...中继命令。我是否通过从MainWindow获取MenuItem来将其命令绑定到此视图模型的属性来打破任何指导?

  • 这个动作我绑定MenuItem命令将实例化一个新的ViewModel和一个新的视图,并显示它。再一次,在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!

+0

有些人将StackOverflow用户称为Stackers – 2010-09-20 15:15:34

+0

@Eduardo,wtaniguchi:参见[本讨论](http://meta.stackexchange.com/questions/6254/what-should-the-users-of-stack-溢出被称为)在元 – 2010-09-21 08:18:10

回答

6

我创建了一个MainWindowViewModel,并使用从这里的RelayCommand类来...中继命令。我是否通过从MainWindow获取MenuItem来将其命令绑定到此视图模型的属性来打破任何指导?

不,你没有违反任何指导原则。它的菜单项绑定到MainWindowViewModel的命令是完全合适的(还有什么地方会你把这个命令呢?)

这个动作我绑定菜单项命令是要实例化一个新的视图模型和新的查看并显示它。再一次,在MVVM上下文中可以吗?

当然,创建一个新的ViewModel是完全正确的。至于创建一个新的视图,它取决于你如何创建它...你当然应该从不从ViewModel显式实例化一个视图,因为它会引入VM对视图的依赖关系。

我的MainWindow将是一种“仪表板”,我将有多个模型附加到此仪表板。我应该将所有这些模型包装在单一视图模型中吗?

这取决于你的意思是“包装” ......你的MainWindowViewModel可以通过属性公开其他的ViewModels,和论文的虚拟机将在视图中的不同部分进行显示。如果这就是你的意思,是的,你应该包装它们。

+0

谢谢你的回应。对于第二个答案,当我问这个问题的时候,我正在思考这个问题。假设我不会显式调用“new SomeView();”,我应该如何从视图模型中调用另一个视图?关于第三个答案,我需要公开视图的不同部分所需的ViewModels,并使用UserControl + ResourceDictionary来呈现该类型,并将公开的VM绑定到它? – wtaniguchi 2010-09-20 16:39:28

+0

对于第二点,我通常使用一个ContentControl,它根据viewmodel的类型选择适当的DataTemplate。对于第三次:是的,正好 – 2010-09-20 19:05:39

+0

好吧!谢谢!我认为我现在有了更好的理解,并将围绕这个问题开展工作! – wtaniguchi 2010-09-20 19:30:23

3

添加到托马斯回答:

我会为仪表板的每个部分创建不同的用户控件和视图模型分配给每个用户控件。

2

我创建了一个MainWindowViewModel,并使用从这里的RelayCommand类来...中继命令。我是否通过从MainWindow获取MenuItem来将其命令绑定到此视图模型的属性来打破任何指导?

不,这正是您放置命令的地方。

这个动作我绑定MenuItem命令将实例化一个新的ViewModel和一个新的视图,并显示它。再一次,在MVVM上下文中可以吗?

它不应该知道如何实例化一个新视图;这是观点的工作。如何做到这一点的具体细节取决于你如何展示这个新视图 - 它可以像视图中的ContentPresenter绑定到视图模型中的属性一样简单,所以当你设置属性(并提高PropertyChanged )ContentPresenter使用其相关的DataTemplate呈现新对象。

如果通过“实例化新视图”,你的意思是“打开一个新窗口”,事情会变得有点蹊跷。有没有一种特别优雅的方式来做到这一点,特别是如果你想让新窗口成为模态对话框。一种方法是将视图的代码隐藏添加到视图模型中的PropertyChanged上的事件处理程序;当从属视图模型属性被设置时,视图中的代码将创建并显示新窗口。

我的MainWindow将是一种“仪表板”,我将有多个模型附加到此仪表板。我应该将所有这些模型包装在单一视图模型中吗?

当然。这是一个非常普遍的模式。例如,公开可观察的集合属性并将某种ItemsControl绑定到它上面并不罕见;该视图将自动为您放入该集合的每个视图模型创建视图。同样,具体实现实际上取决于您的应用程序。