【问题标题】:XAML (Silverlight & WPF) complex UI composing with MVVM [closed]使用 MVVM 组成的 XAML(Silverlight 和 WPF)复杂 UI [关闭]
【发布时间】:2011-09-21 03:58:59
【问题描述】:

我开始着手重新设计基于 XAML 的应用程序(软件设计),这是我 2 个月前写的。我认为我在开发过程中犯了很多架构错误,这导致了应用程序的 UI 部分难以扩展、维护、代码难以理解的情况。我的应用程序是使用 PRISM 4 以 MVVM 风格编写的,但尽管 Prism 是为模块化设计而发明的,但我的应用程序却是非常单一的。我将继续在新设计中使用 PRISM 4,但这次我想将应用程序的 UI 部分分解为更小、可重用、可扩展的构建块。

假设我们正在设计数据输入表单。顶部容器包含保存、取消按钮和 TabControl,其中包含 2-3 个包含大量分组输入控件的选项卡。

我可以看到两种完全不同的 UI 设计方法:静态(编译时)、动态(运行时)。静态是在编译之前预定义 UI,即 DataGrid 与 XAML 中定义的列。当您在运行时编写 UI 时是动态的,即您在 XAML 中定义了 DataGrid,但在运行时根据用户操作添加列。

当您决定使用哪种方法(静态或动态)时,您使用什么规则?在这个特定的例子中你会选择什么?

下一个大问题是如何分解 UI。

您在定义 UserControls 时使用了哪些规则,您将如何为这个示例表单定义 UserControls?现在关于 ViewModel,您会为这个示例表单创建单个 VM 还是多个(解释)?当 ViewModel 包含其他 ViewModel(不是简单的模型包装器,而是包含逻辑的真实 VM)时,您如何看待这种情况。

现在至少对我来说是最难的问题。扩展 UI 构建块(UserControls 和 ViewModels)。

当您需要创建一些表单的副本但界面和/或逻辑略有不同的情况很常见,尤其是当您需要在 UI 中集成授权(权限)时。假设我们需要支持稍微不同版本的示例表单(不管有多少版本,假设 2-6)。

我可以想到这些方法来解决这个问题:

  1. 从(用户控件和视图模型)创建整体副本并修改它们(静态方式)。好在所有变体都是独立的,非常灵活,没有依赖关系,坏事是代码重复,如果您需要更改所有变体中的某些内容,很可能您将不得不在任何地方进行修改,尤其是使用 ViewModels。

    李>
  2. 条件演示,您可以在 ViewModel 中添加大量条件代码,例如 IsThisVisible、IsThatDisabled(动态方式)。好事最大代码重用,坏事代码臃肿和混乱。您的代码将难以理解、维护。

  3. 将 UI 分解为非常小的原子用户控件,从该 UI 部分组成单独的表单变体,并将 ViewModel 继承与虚拟成员和覆盖一起使用。我从未使用过 ViewModel 的继承,想听听您对这个问题的看法。

n.其他我想不到的方法。

【问题讨论】:

    标签: c# wpf silverlight architecture


    【解决方案1】:

    根据我的经验,开发路径往往是这样的:

    1. 在 Blend 或 Kaxaml 中设计一个视图,以及支持该视图的视图模型。
    2. 意识到视图的某些部分需要是动态的。在视图模型中实现标志并在视图中实现样式以显示/隐藏它们。
    3. 意识到所有的标志都失控了。摆脱标志,重构视图以呈现用户控件集合,并重构视图模型以动态填充视图模型集合。

    有时我很早就知道我将需要使用方法#3,并且我从一开始就为它设计。

    但 WPF 和 MVVM 的优点之一是,即使我 从一开始就没有为此设计,但如果情况需要,朝那个方向前进也不会太难。将一堆视图模型属性重构到一个视图模型集合中,只要你做了几次,就不会花费很多时间或精力。

    不过,我可以告诉你:制作 XAML 对象的副本并对其进行编辑会使我的脑海中响起喇叭。可以想象在什么情况下可能没问题,但这不是打赌的方式。

    【讨论】:

    • 感谢您分享您的经验,我第一次尝试设计我正在处理的项目在第 3 步失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多