【问题标题】:WPF/XAML vs MVC Paradigm: flawed in the very fundamental designWPF/XAML 与 MVC 范式:在非常基本的设计中存在缺陷
【发布时间】:2011-06-17 20:59:34
【问题描述】:

在 MVC 中,一个模型可以有多个视图,在 WPF 中,一个 XAML 代码隐藏模型紧靠 1 个 XAML(视图)是不是 WPF/XAML 从一开始就在 MVC 方面存在缺陷?

【问题讨论】:

    标签: wpf model-view-controller design-patterns architecture


    【解决方案1】:

    我建议将 MVVM 用于 WPF。

    您将 MVC 与 Windows 窗体与 WPF 与背后的代码进行比较 - 将架构模式与技术进行比较(不使用模式)。这是不公平的比较。

    我在MVVM starting from a Windows Forms perspective 上写了一个系列,可能有助于理解这一点。您会发现,使用 WPF 实现的 View 和 ViewModel 分离比 MVC 的 Controller 实现起来要干净和简单得多。它实际上允许使用更少的实现工作来实现更多解耦架构。

    【讨论】:

    • 我听说过 MVVM,它是 MVC 的一种变体,但为什么 xaml 没有从一开始就完成?
    • @user310291:从一开始就完成了。它非常灵活。这是它的力量的一部分。您正在将使用的体系结构模式(在 Windows 窗体中很难做到)与底层技术进行比较。这不是一个干净的比较。
    • @user310291:XAML 让开发非常解耦的应用程序变得轻松。
    • @user310291:我建议您通读我的系列文章 - 我认为您对 MVVM 的工作原理存在误解。
    • @user310291:我想问题是有时你想在不使用模式的情况下构建 UI。例如,如果您正在制作可重用的自定义控件,则 MVVM/MVC/MVP 确实无效。使用架构模式并不总是有意义,这就是为什么我很高兴它不是内置的。话虽如此,MVVM 在“标准” wpf 之上几乎没有开销或框架要求,因此从某种意义上说,它是内置的,但作为一个选项内置。
    【解决方案2】:

    好问题!

    在 MVC 中,您声明一个模型可以有多个视图,这是真的。但是,每个视图都有自己的控制器。

    在 MVVM 中,一个模型可以有多个视图,在这种情况下,每个模型都可以有自己的视图模型。

    但是,实际上,如果 ViewModel 没有任何高度特定于某个视图的概念,则完全可以重用视图模型。事实上,我写了一篇关于跨平台 XAML 应用程序的文章,其中我在三个应用程序之间重用代码,一个在 WP7 上,一个在 Silverlight 中,另一个在 WPF:

    http://blogs.msdn.com/b/mikeormond/archive/2010/12/09/writing-cross-platform-xaml-applications.aspx

    每个应用的视图都非常不同,但是我能够为所有三个应用重复使用模型和视图模型。

    【讨论】:

    • 非常有趣,因为您的示例表明,如果在 XAML 设计中从一开始就尊重 MVC 范式,您必须采取一些技巧来做应该显而易见的事情!
    • 技巧?呃……什么招数?我创建 UI 应用程序已有 10 年了,并且使用过 MVC、MVP 和 MVVM。我个人喜欢 MVVM 的简单性和可测试性。我在 WinForms 和 WPF 中使用过 MVVM。这确实是一种很好且灵活的模式。
    • 为什么不将它直接集成到 XAML 中,而不必构建另一层框架?
    • 在 WPF、Silverlight 和 Windows Phone 之间共享汇编代码:对于大型项目来说非常不切实际:stackoverflow.com/questions/4848487/…
    • 在我的项目中,我需要的不仅仅是在不同平台上进行样式设置,我还必须创建完全不同类型的小部件。如果 XAML 以正确的方式设计,即真正分离 XAML 视图和模型,则不应该出现这样的问题。
    【解决方案3】:

    WPF/XAML 是一种技术,而 MVC 是设计模式,当技术不将您限制在特定模式时,它是很好的,并且允许开发人员选择使用什么模式。与编程语言相同,您可以使用任何设计模式。

    您可以将 MVC、MVP、MVVM 或 YourMegaPattern 与 XAML\WPF 一起使用。技术应该高于模式,它是通常绑定到特定模式的框架。

    例如,您可以采用 ASP .NET 技术,以及基于它的 MVC 框架。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 2012-03-06
      相关资源
      最近更新 更多