【问题标题】:What are the pros and cons of the various view creation techniques in WPF?WPF 中各种视图创建技术的优缺点是什么?
【发布时间】:2011-01-09 16:20:21
【问题描述】:

在过去的两年里我一直在使用 MVVM,从那时起它肯定已经变得更好了。当我阅读数百篇 MVVM 文章和 stackoverflow 问题时,我注意到似乎有越来越多的文章将视图/视图模型的关系和创建描述为 ViewModel first 或 View first。这些文章通常使用 IoC 或 DI。

我最喜欢的技术是使用数据模板来创建视图,并根据视图模型而不是视图来构建应用程序。我很少再看到使用这种模式的文章了。

<DataTemplate DataType="{x:Type ViewModels:DummyViewModel}">
  <Views:DummyUserControl DataContext="{Binding}"/>
</DataTemplate>

可测试性和解耦似乎是这些“非数据模板”V-VM 创建/关系设计和文章的主要关注点,而且它们通常与 MEF 或 PRISM 有关。最终我想知道以下几点:

  1. 是否仍在使用或推荐 DataTemplate 视图创建技术?
  2. 视图优先设计的优缺点是什么?
  3. 视图模型优先设计(注入视图)的优缺点是什么

如果它们与 MEF/PRISM 无关,则欢迎提供涵盖这些主题的文章的任何良好链接。

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    我们体验到 DataTemplate 方法存在一些局限性。例如,模板被实例化为共享(单例)实例。在某些情况下,这会产生不良副作用。这就是我们使用 ViewModel 优先设计(注入视图)的原因。

    WPF 应用程序框架 (WAF) 项目页面描述了我们使用的方法:

    http://waf.codeplex.com/wikipage?title=Model-View-ViewModel%20Pattern&ProjectName=waf

    【讨论】:

      【解决方案2】:

      1.DataTemplate 视图创建技术是否仍在使用或推荐?

      这是我在 MVVM 中操作的首选方法。我非常喜欢这种方法,原因我将在下面说明。我在所有开发中都使用它。

      2.视图优先设计的优缺点是什么?

      我发现这里的主要优点是设计时体验更容易一些。设计者提前“了解”数据上下文,并且往往能够更轻松地完成工作。

      在我看来,这里的主要缺点是您在 View 和 ViewModel 之间添加了更紧密的耦合。选择特定的模型进行传递也更加困难。

      3.viewmodel优先设计(注入视图)的优缺点是什么

      我个人喜欢这种方法。这样,应用程序的“逻辑”端完全包含在 ViewModel 层中。通过使用 ContentPresenters,您可以让 ViewModel 轻松生成其他 ViewModel,从而定义应用程序的“流程”。设计师可以很容易地更改视图。

      不过,这里的缺点是设计时可用性略有下降,因为视图在设计时并不真正了解 VM,因此您失去了一些可设计性。

      【讨论】:

      • 嗯,这 100% 说明了我自己的经历和意见。最近写了这么多关于使用容器生成视图和视图模型的文章,我开始担心我“错过了这条船”。您是否使用界面将视图注入到视图模型中?就个人而言,我不希望我的视图模型对视图有任何引用。
      • 我没有提到 MEF - 但我实际上也使用了它。它对于处理上述边缘情况(即:服务)以及实际执行数据模板非常有用。您可以使用 MEF 从您的视图中设置您的 DataTemplates,而不必“污染”您的 app.xaml,例如...
      • 谢谢!感谢您的反馈。
      • 为什么 View 和 ViewModel 之间的紧密耦合是一个骗局?
      • 它降低了设计的灵活性。在可能的情况下,在开发的所有部分中保持松散耦合可以更容易地更改任何单个部分而不会破坏任何内容。设计中的耦合越紧密,整体设计的灵活性就越低。
      猜你喜欢
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 2010-09-06
      • 2010-10-29
      • 2011-10-23
      • 2017-10-05
      • 1970-01-01
      相关资源
      最近更新 更多