【发布时间】: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)。
我可以想到这些方法来解决这个问题:
-
从(用户控件和视图模型)创建整体副本并修改它们(静态方式)。好在所有变体都是独立的,非常灵活,没有依赖关系,坏事是代码重复,如果您需要更改所有变体中的某些内容,很可能您将不得不在任何地方进行修改,尤其是使用 ViewModels。
李> 条件演示,您可以在 ViewModel 中添加大量条件代码,例如 IsThisVisible、IsThatDisabled(动态方式)。好事最大代码重用,坏事代码臃肿和混乱。您的代码将难以理解、维护。
将 UI 分解为非常小的原子用户控件,从该 UI 部分组成单独的表单变体,并将 ViewModel 继承与虚拟成员和覆盖一起使用。我从未使用过 ViewModel 的继承,想听听您对这个问题的看法。
n.其他我想不到的方法。
【问题讨论】:
标签: c# wpf silverlight architecture