c# - 对 MVVM 模式有疑问?

标签 c# wpf mvvm c#-4.0

我正在创建一个 WPF 应用程序并遵循 MVVM 模式。但是在做事情的时候我担心的是,是不是按照MVVM?带着这些疑惑请指导。

  1. 是否有必要为每个 View 创建一个新的 View 模型?如果不是,那么创建单个 MasterViewModel 是否会违反 MVVM?

  2. ViewModel 如何相互通信?

  3. MainWindow.xaml.cs 在我集成所有 View 的地方,应该只有 viewmodel 的初始化并在那里分配 DataContext 还是我也可以放置其他代码?

  4. 我有自己定义的 EventHandlers。我应该在 ViewModel 中还是在 model-view-viewmodel 之外使用它们?

最佳答案

您需要阅读一些有关 MVVM 的内容。请参阅以下问题:

Good examples of MVVM Template
Good Silverlight-MVVM Practice Example
MVVM Light Toolkit samples

对于您的问题:

  1. 有些人遵守这条规则。 :一个 View 模型每个 View 见 Rule #2 on this article

    并非绝对有必要遵循这一点,但是创建一个 MasterViewModel 以在任何地方使用它,意味着您还没有理解 MVVM。

    如果您指的是封装公共(public)位,那么 MVVM Light Toolkit 可能有一个 ViewModelBase 类用于封装一些东西。

  2. ViewModels 不会相互通信,ViewModels 将与 Views 通信,Views 将与其他 Views 通信(并可能为它们实例化 ViewModels)一些框架甚至有松散耦合的方式来做到这一点( ReactiveUI comes记住)

  3. 当一个 View 被调用时,您可以实例化它对应的 View 模型,然后将它设置为数据上下文。 但是,有许多不同的模式可以做到这一点。 @Euphporic 在评论中提到 ViewModel-first,其中 ViewModels 通过 Ioc 创建 View 。参见 Which came first- The View or ViewModel

    MVVM Light 有一个 ViewModel 定位器,它允许您在 XAML 中静态定义 View ViewModel。它会在您创建 View 时自动设置。

  4. 此处不完全清楚,(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/

相关文章:

WPF MenuItem IsChecked 绑定(bind)不起作用

c# - ReSharper WPF错误: “Cannot resolve symbol ” MyVariable“due to unknown DataContext”

c# - Prism 导航 - 上一个和下一个 View

c# - MVVM Light SimpleIoC 与 Ninject

unit-testing - 在 Microsoft.Practices.ServiceLocation.dll 中出现错误 'Microsoft.Practices.ServiceLocation.ActivationException'

c# - 在 C# 中计算过滤的 excel 范围的行数

wpf - 可停靠的Windows。 float 窗口和主窗口菜单集成

c# - 从 JSON 确定对象类型

c# - LINQ 加入列表列表

c# - 如何在 Moq 的 SetUpSequence 上使用回调?