嵌套组件应如何与GUI应用程序中的模型交互?

时间:2010-06-15 21:25:17

标签: model-view-controller user-interface design-patterns oop

广泛的设计/架构问题。如果您在GUI中嵌套了组件,那么这些组件与数据交互的最常用方法是什么?

例如,假设某个组件​​在其某个按钮上单击以保存数据。是否应该将保存请求委派给该组件的祖先,最上层的祖先最终将请求传递给控制器​​?

或者GUI应用程序中的模型/数据存储通常是单例,因此层次结构中任何级别的组件都可以直接获取/设置数据吗?

或者是在组件层次结构中注入依赖关系的控制器,以便任何给定组件只是远离数据存储区/模型的一个中介?

3 个答案:

答案 0 :(得分:2)

我的第一个想法是定义单例数据层API,可由GUI组件调用。

如果你想要多个数据实例,那么就给出“句柄”,这些句柄可以由GUI组件存储,然后传入数据层以再次获取数据。

这个想法类似于,例如文件系统API;或SQL服务器API;或任何O / S API。

答案 1 :(得分:1)

通常,使用嵌套组件操作的选项很少:

  • 嵌套组件使用与根组件相同的模型/嵌套组件使用自己的模型。

  • 嵌套组件与根组件相同的控制器交互/嵌套组件使用自己的控制器进行操作。

没有一个正确答案可以使用哪个选项。当然,使用相同的模型和相同的控制器是最简单的方法,但如果嵌套组件包含复杂的UI逻辑,则最好将模型或/和控制器分开。

另外,你用什么语言?什么平台?在不同的编程环境中,不同的实现更好。如果您使用平台支持面向对象的基于组件的GUI模型,您可以将嵌套控件封装到用户控件中,并获得可重用的封装易用组件。

我认为对模型/控制器使用单例是个坏主意,特别是你使用带垃圾收集器的语言。使用单例很简单,但是如果在根视图上需要第二个嵌套控件实例呢?

答案 2 :(得分:1)

我同意上面的STO:

  • 将数据推送到底层控制器/ viewmodel,这是与父视图的C / VM共享的,这是我在大多数应用程序中所做的。
  • 拥有单身是个坏主意!如果您认为需要单例,则可以通过调用缓存实例的Factory来获得相同的结果。例如。 factory.GetAcountViewModel();
  • 一般来说,我不会将处理委托给父母。这降低了代码的可测试性,因为现在您通过UI层传递数据和状态。

只是一个FYI: 如果您需要额外的阅读,您可能还需要查看http://compositewpf.codeplex.com,它解决了可组合UI的普遍问题。