C# WPF MVVM质疑

C# WPF MVVM质疑,c#,wpf,mvvm,C#,Wpf,Mvvm,各位StackOverflow用户(或Stackoverflowers?)您好: 我正在通过编写WPF来学习。我读了几篇文章/看到了几段视频,在WEB开发人员的背景下,我启动了VS2010,并开始做一个示例应用程序,帮助我学习基础知识 我也读了一些关于MVVM的书,并开始使用它。我将我的解决方案设置为使用WPF4.0、ActiveRecord2.1和SQLite,一切都进行得很顺利。但我仍然有一些疑问: 我创建了一个MainWindowViewModel,并且正在使用RelayCommand类

各位StackOverflow用户(或Stackoverflowers?)您好:

我正在通过编写WPF来学习。我读了几篇文章/看到了几段视频,在WEB开发人员的背景下,我启动了VS2010,并开始做一个示例应用程序,帮助我学习基础知识

我也读了一些关于MVVM的书,并开始使用它。我将我的解决方案设置为使用WPF4.0、ActiveRecord2.1和SQLite,一切都进行得很顺利。但我仍然有一些疑问:

  • 我创建了一个MainWindowViewModel,并且正在使用RelayCommand类从到。。。转达命令。我从主窗口让一个MenuItem命令绑定到此viewmodel的属性,这是否违反了任何准则

  • 我将MenuItem命令绑定到的这个操作将实例化一个新的ViewModel和一个新视图,并显示它。再说一次,在MVVM上下文中这样行吗

  • 我的主窗口将是一种“仪表板”,并且我将有多个模型连接到此仪表板。我是否应该将所有这些模型包装在一个视图模型中

大概是这样的:

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 */

}
公共类MainWindowViewModel{
私人可观测集合公开订单;
私人地址deliveryAddress;
私人订单新订单;
/*OpenOrders集合的包装器*/
/*送货地址包装*/
/*新订单包装*/
/*命令绑定*/
}
蒂亚

我创建了一个MainWindowViewModel,并从这里使用RelayCommand类来。。。转达命令。我从主窗口让一个MenuItem命令绑定到此viewmodel的属性,这是否违反了任何准则

不,你没有违反任何准则。将MenuItem绑定到MainWindowViewModel的命令是非常合适的(您还想把这个命令放在哪里?)

我将MenuItem命令绑定到的这个操作将实例化一个新的ViewModel和一个新视图,并显示它。再说一次,在MVVM上下文中这样行吗

当然,创建一个新的ViewModel非常好。至于创建新视图,这取决于您如何创建它。。。当然,您永远不应该从ViewModel显式地实例化视图,因为它将引入VM对视图的依赖关系

我的主窗口将是一种“仪表板”,并且我将有多个模型连接到此仪表板。我是否应该将所有这些模型包装在一个视图模型中


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

在托马斯的答案中添加:

我将为仪表板的每个部分创建不同的usercontrol,并为每个usercontrol分配一个viewModel

我创建了一个MainWindowViewModel,并从这里使用RelayCommand类来。。。转达命令。我从主窗口让一个MenuItem命令绑定到此viewmodel的属性,这是否违反了任何准则

不,那正是你放命令的地方

我将MenuItem命令绑定到的这个操作将实例化一个新的ViewModel和一个新视图,并显示它。再说一次,在MVVM上下文中这样行吗

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

如果“实例化一个新视图”的意思是“打开一个新窗口”,那么事情就有点可疑了。没有一种特别优雅的方法可以做到这一点,特别是如果您希望新窗口是一个模态对话框的话。一种方法是向视图的代码中添加一个事件处理程序,该代码监听视图模型上的PropertyChanged;设置从属视图模型属性时,视图中的代码将创建并显示新窗口

我的主窗口将是一种“仪表板”,并且我将有多个模型连接到此仪表板。我是否应该将所有这些模型包装在一个视图模型中


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

有些人将StackOverflow用户称为Stackers@Eduardo,wtaniguchi:请参阅Meta,谢谢您的回复。对于第二个答案,我在问这个问题时仔细考虑了一下。假设我不会显式调用“newsomeview();”,那么我应该如何从viewmodel中调用另一个视图?关于第三个答案,我需要公开视图不同部分所需的ViewModels,并使用UserControl+ResourceDictionary呈现该类型,并将公开的VM绑定到该类型?对于第二点,我通常使用ContentControl根据viewmodel的类型选择适当的DataTemplate。第三个:是的,没错!谢谢我想我现在有了更好的理解,并将围绕这个问题展开思考!