WPF MVVM怀疑

时间:2010-09-20 14:23:59

标签: c# wpf mvvm

Hello StackOverflow用户(或 Stackoverflowers ?):

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

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

  • 我创建了一个MainWindowViewModel,并使用here中的RelayCommand类来中继命令。我是否通过从MainWindow使用MenuItem将其命令绑定到此viewmodel的属性来破坏任何准则?

  • 这个动作我将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!

3 个答案:

答案 0 :(得分:6)

  

我创建了一个MainWindowViewModel,并且从这里使用RelayCommand类来...中继命令。我是否通过从MainWindow使用MenuItem将其命令绑定到此viewmodel的属性来破坏任何准则?

不,你没有违反任何准则。将MenuItem绑定到MainWindowViewModel的命令是完全合适的(无论如何你还会把这个命令放在哪里?)

  

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

当然,创建一个新的ViewModel是完美的。至于创建一个新视图,它取决于你如何创建它...当然永远不会从ViewModel显式地实例化一个视图,因为它会引入VM对视图的依赖。

  

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

这取决于你的意思“换行”...你的MainWindowViewModel可以通过属性公开其他ViewModel,这些VM将显示在视图的不同部分。如果这就是你的意思,是的,你应该把它们包起来。

答案 1 :(得分:3)

添加到托马斯答案:

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

答案 2 :(得分:2)

  

我创建了一个MainWindowViewModel,并且从这里使用RelayCommand类来...中继命令。我是否通过从MainWindow使用MenuItem将其命令绑定到此viewmodel的属性来破坏任何准则?

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

  

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

它不应该知道如何实例化新视图;这是观点的工作。如何执行此操作的具体细节取决于您如何显示此新视图 - 它可能就像在视图中将ContentPresenter绑定到视图模型中的属性一样简单,因此在设置属性时(并引发PropertyChanged) )ContentPresenter使用其相关的DataTemplate呈现新对象。

如果“实例化一个新视图”意味着“打开一个新窗口”,事情就会变得有点怪异。没有一种特别优雅的方法可以做到这一点,特别是如果你想让新窗口成为一个模态对话框。一种方法是向视图的代码隐藏添加一个事件处理程序,该代码隐藏在视图模型上侦听PropertyChanged;当设置从属视图模型属性时,视图中的代码将创建并显示新窗口。

  

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

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