我正在使用MVC / MVP GUI来编辑文档。该文档具有树结构,其中一些节点表示文本,另一些节点表示其他图像。应用程序模型还包括一个命令堆栈,命令直接在模型上运行。

由于不同的节点具有完全不同的控件,我计划为每个节点实现单独的MVC / MVP三元组。我遇到麻烦的地方是如何同步对等V和C组件的创建和销毁。

我的想法:
- 在每个节点上监听“childAdded”键入事件,然后根据这些事件创建对等体 - 使用工厂在模型中创建节点,并让该工厂也创建对等

动态视图/控制器生成有哪些常见模式或最佳实践?

有帮助吗?

解决方案

我建议您在此网站上查看一些UI模式

至于你的具体问题,我会做以下

显示节点的表单将实现INodeView接口

INodeTreeForm接口的一个方法是添加单个节点的能力。它将传递在NodeTreeScreen对象中创建的Node类。将有两个关键属性。第一个是节点的密钥,第二个是节点的类型。

您将添加节点,使控件上有一个包含密钥的字段。

与INodeTreeForm接口一起,您将拥有一个INodeView接口。这将涵盖您将要切换的视图区域或新表单。

当您单击节点时,它会将密钥传递给NodeTreeScreen,后者会查看它是什么类型的节点。它有一组INodeView对象。 INodeView的一个属性是它是哪种类型的节点。

您检索正确的INodeView。关闭当前的INodeview,将当前的INodeView设置为您检索的INodeView,将其传递给节点,并告诉它自己显示。

您可以选择INodeView会说什么。您可以为每种不同类型注册一个表单/控件。例如,一个INodeViewText,INodeViewImage等。或者只是一个综合的INodeViewForm,让实现INodeView的对象负责实际的绘图。

根据您的GUI工具包,这可能意味着一个表单可能实现了许多不同的接口。

对于添加,删除和创建节点,这可以通过实现INodeTreeForm和NodeTreeScreen的表单之间的交互来完成。这将要做的事情是执行你已经创建的命令来修改模型。

通过实现界面背后的每一件事,您可以更改实施,而无需搞砸其余的软件。实现不同接口的对象可以在不影响其他对象的情况下进行更改,只要它们继续正确实现接口即可。

这是Martin Fowler网站上Passive View的变种。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top