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!
答案 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绑定到它上并不罕见;视图将自动为您放入该集合的每个视图模型创建视图。同样,具体实现实际上取决于您的应用程序。