【发布时间】:2010-12-29 09:59:51
【问题描述】:
我正在学习MVP模式,但仍有一些疑问。
Martin Hunter 在他的 MVC/MVP 概述中写道:
在 MVP 中,视图变成了一个超薄的组件,其目的纯粹是为用户提供演示。视图捕获并处理用户提出的事件,但将这些事件直接转发给知道如何处理它们的演示者。
(...)
但是,使用 MVP,视图会捕获引发的事件并将它们转发给控制器(演示者)
这对按钮和文本框来说很好,但是如果有一些更复杂的控件呢?假设我正在使用第 3 方组件,例如 Devexpress 的 TreeList 控件。假设我想在用户单击展开按钮“+”时动态构建子节点。不使用任何模式我可以这样编码:
private void BeforeExpand_EventHandler(object sender, BeforeExpandEventArgs e)
{
TreeList treeList = sender as TreeList;
MyModelObject nodeObj = e.Node.Tag as MyModelObject;
treeList.BeginUnboundLoad();
//Create sub-nodes depending on nodeObj
treeList.EndUnboundLoad();
}
如您所见,有一些视图对象,例如 BeforeExpandEventArgs、TreeListNode,以及一些特定的操作,例如 BeginUnboundLoad(),等等。在这种情况下,我的视图层不能“超薄”。我不能直接传递给像 BeforeExpandEventArgs 这样的 Presenter 对象,因为它会通过一些 View 东西影响 Presenter。
那么我的问题是:我可以在视图层中放入多少逻辑?比如下面的代码可以吗?
private void BeforeExpand_EventHandler(object sender, BeforeExpandEventArgs e)
{
TreeList treeList = sender as TreeList;
MyModelObject nodeObj = e.Node.Tag as MyModelObject;
treeList.BeginUnboundLoad();
e.Node.Nodes = this.presenter.GetNodes(nodeObj);
treeList.EndUnboundLoad();
}
【问题讨论】:
标签: c# .net winforms design-patterns mvp