winforms的复杂监督控制器示例

时间:2009-07-09 02:26:11

标签: c# mvp supervisingcontroller

很抱歉,如果之前已经提出此问题,但我找不到任何帮助。

我想知道是否有人使用监督控制器MVP模式创建了复杂winforms的任何好例子。我已经阅读了很多例子,但它们真的很简单,只处理一个表格和一个模型。

我正在寻找的是一个示例,它展示了如何将数据从一个视图传递到另一个视图以及通信线路应该在哪里以及应该绑定到什么内容。

说我有这样的UI: alt text http://img12.imageshack.us/img12/2683/layoutcroped.jpg

抱歉狡猾的UI模型。基本上每个用户控件都有自己的presenter和模态层对象。

我需要做的是在用户控件1上输入文本框,使用服务对象(在用户控件1的演示者中)从数据库中获取正确的项目,并将其作为模式传递给用户控件2 。

我的问题是:我是通过视图界面将模型传递给用户控件2还是传入其演示者?

很抱歉,如果这有点难以理解,我只是看到有人说你可以使用带有使用MVP模式的用户控件的表单,但找不到任何关于如何在两者之间传递数据的例子。

修改 我已经制定了两个不同的是我认为我可以做到这一点:

我认为Ex1是更好的,因为它仍然让主持人负责。做他们想做的事。

您怎么看?

感谢。

4 个答案:

答案 0 :(得分:1)

我采用的方式来自面向事件,发布/订阅方法。

模式如下:

  1. 用户单击第一个视图上的“编辑”按钮会触发一个事件(您可以将其称为命令),其中包含一个参数(在这种情况下,ID,文本框的值)。请将事件称为“EditRequested”。这是事件的“发布”,告诉任何想知道发生这种情况的人和详细信息。实际发布可能在控制器/演示者中完成。

  2. 第二个视图的控制器/演示者侦听上述事件,并在事件触发时相应地动作,加载数据并使用事件参数(ID)切换到编辑模式。这是模式的“订阅”部分。

  3. 理想情况下,这可以使用事件聚合器完成(CAB提供一个和Prism一样),但您可以手动为单个案例执行某些操作。事件聚合器消除了发布者和订阅者必须彼此了解的需要,从而改善了松散耦合。

答案 1 :(得分:1)

如果使用状态完全模型,则使用监督控制器,我们需要视图通过观察者/可观察机制立即与其同步,在这种情况下,我们可能会希望减少可测试性并允许视图之间的直接通信和模型。

Supervised Controller

请注意,提示视图通过Presenter(直接)和Model(通过事件)更新其显示。在大多数情况下,当涉及更复杂的逻辑时,视图会响应模型状态的简单更改并更新自身 - 演示者负责根据应用程序规则更改视图。

因此,对于您的示例,您的UserControl1将通过演示者将数据发送到模型,然后模型将通知所有已注册的更改视图(将它们发送到模型以进行相应更新)。

希望有所帮助。

答案 2 :(得分:0)

认为从你的说法中你最好不要考虑让一位主持人专门协调(和监督)特定演示文稿所需的内容(即“收集客户信息” “)。然后考虑将模型(或其外观,如果有足够的复杂性)传递给构造中的Presenter。

如果用户控件的演示者本身与模型紧密耦合(表面上的文本框不像声音那样),那么您可以将该模型传递给该演示者,但我不会通过它进入视图界面。

我现在需要更多地了解您正在调用用户控件的内容,以便有机会帮助您构建它们的演示文稿。

我不知道有哪个例子可以说明你开始充实的场景,但我会关注Fowler网站上不同的mvp例子,看看Jeremy Miller的Build Your Own Cab系列。两者都会有点令人沮丧,因为它们都不会很快解决你的问题,但两者都会为这个广泛主题提供洞察力。

希望它有帮助! Berryl

答案 3 :(得分:0)

我们在这个问题上遇到了一些严重问题。我们首先假设第一个视图负责创建和配置第二个视图和第一个展示器,用于装箱和配置第二个。这个解决方案很糟糕,原因很多。首先,第二个视图由另外两个对象(第一个视图和第二个演示者)配置。第二个缺点是将视图绑定在一起并对视图具有逻辑责任。

我们一直在寻找解决方案并决定我们需要这个绑定在展示者中松散并执行。所以我们创建了工厂装箱视图和演示者,它与给定的id(字符串或guid)相匹配。当用户在视图上执行某些操作时,此调用将转发给演示者,并决定应显示哪一对。