【问题标题】:WPF MVVM DoubtsWPF MVVM 疑点
【发布时间】:2011-04-14 17:18:20
【问题描述】:

您好 StackOverflow 用户(或 Stackoverflowers?):

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

我也阅读了一些关于 MVVM 的信息,并开始使用它。我将我的解决方案设置为使用 WPF 4.0、ActiveRecord 2.1 和 SQLite,一切顺利。但我还是有些疑惑:

  • 我创建了一个 MainWindowViewModel,并且正在使用来自 here 的 RelayCommand 类来...中继命令。我是否通过让 MainWindow 中的 MenuItem 将其命令绑定到此视图模型的属性而违反了任何准则?

  • 我绑定 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, wtaniguchi:参见元数据上的this discussion

标签: c# wpf mvvm


【解决方案1】:

我创建了一个 MainWindowViewModel,并使用 RelayCommand 类从这里...中继命令。我是否违反了任何准则,让 MainWindow 中的 MenuItem 将其命令绑定到此视图模型的属性?

不,您没有违反任何准则。将 MenuItem 绑定到 MainWindowViewModel 的命令是非常合适的(无论如何,您还会将此命令放在哪里?)

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

当然,创建一个新的 ViewModel 完全没问题。至于创建一个新视图,这取决于你如何创建它......你当然应该永远从 ViewModel 显式实例化视图,因为它会引入 VM 对视图的依赖。

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

这取决于您所说的“包装”...您的MainWindowViewModel 可以通过属性公开其他视图模型,这些虚拟机将显示在视图的不同部分。如果这就是你的意思,是的,你应该把它们包装起来。

【讨论】:

  • 感谢您的回复。对于第二个答案,我在问这个问题时正在考虑这个问题。假设我不会显式调用“new SomeView();”,我应该如何从视图模型中调用另一个视图?关于第三个答案,我需要公开视图不同部分所需的 ViewModel,并使用 UserControl + ResourceDictionary 来呈现该类型,并将公开的 VM 绑定到它?
  • 对于第二点,我通常使用 ContentControl 根据视图模型的类型选择适当的 DataTemplate。第三次:是的,完全正确
  • 好的!谢谢!我想我现在有了更好的理解,并且会围绕这个问题思考一下!
【解决方案2】:

添加到托马斯的答案:

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

【讨论】:

    【解决方案3】:

    我创建了一个 MainWindowViewModel,并使用 RelayCommand 类从这里...中继命令。我是否违反了任何准则,让 MainWindow 中的 MenuItem 将其命令绑定到此视图模型的属性?

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2010-11-13
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多