我正在创建一个 WPF 应用程序并遵循 MVVM 模式。但是在做事情的时候我担心的是,是不是按照MVVM?带着这些疑惑请指导。
是否有必要为每个 View 创建一个新的 View 模型?如果不是,那么创建单个 MasterViewModel 是否会违反 MVVM?
ViewModel 如何相互通信?
MainWindow.xaml.cs
在我集成所有 View 的地方,应该只有 viewmodel 的初始化并在那里分配 DataContext 还是我也可以放置其他代码?我有自己定义的 EventHandlers。我应该在 ViewModel 中还是在 model-view-viewmodel 之外使用它们?
最佳答案
您需要阅读一些有关 MVVM 的内容。请参阅以下问题:
Good examples of MVVM Template
Good Silverlight-MVVM Practice Example
MVVM Light Toolkit samples
对于您的问题:
有些人遵守这条规则。 :一个 View 模型每个 View 见 Rule #2 on this article 。
并非绝对有必要遵循这一点,但是创建一个 MasterViewModel 以在任何地方使用它,意味着您还没有理解 MVVM。
如果您指的是封装公共(public)位,那么 MVVM Light Toolkit 可能有一个 ViewModelBase 类用于封装一些东西。
ViewModels 不会相互通信,ViewModels 将与 Views 通信,Views 将与其他 Views 通信(并可能为它们实例化 ViewModels)一些框架甚至有松散耦合的方式来做到这一点( ReactiveUI comes记住)
当一个 View 被调用时,您可以实例化它对应的 View 模型,然后将它设置为数据上下文。 但是,有许多不同的模式可以做到这一点。 @Euphporic 在评论中提到 ViewModel-first,其中 ViewModels 通过 Ioc 创建 View 。参见 Which came first- The View or ViewModel。
MVVM Light 有一个 ViewModel 定位器,它允许您在 XAML 中静态定义 View ViewModel。它会在您创建 View 时自动设置。
此处不完全清楚,(a) 如果您有来自按钮、菜单(从 ButtonBase 派生的任何东西)的事件,您应该使用命令模式实现这些事件。 MVVM Light 有一个很好的
RelayCommand<T>
可以帮助你。(b) 其他事件,MVVM Light 具有 EventToCommand 行为,但 Laurent(作者)警告说这会变成反模式。我认为有时您可以在后面的代码中使用普通事件,然后从那里调用您的 ViewModel(但是嘿,我不是这里的专家)
您已经到处问了几个问题。问题可能是您不了解 MVVM 的原因。
简而言之,MVVM 允许您将正确的事情放在正确的位置,即 ViewModel 中的应用程序逻辑/控制,然后借助 Silverlight/WPF 数据绑定(bind)的强大功能,您可以将 ViewModel 挂接到您的 View 。
正如 Laurent 所解释的,有时它并不一定要那么复杂。您甚至不需要始终使用框架。
我强烈推荐观看他的 MIX 视频,标题为 - “理解模型- View - View 模型模式” 从这里:
http://live.visitmix.com/Archive#VideoList
关于c# - 对 MVVM 模式有疑问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5470904/