Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVP:第三方控制,视图层中可以放置多少逻辑_C#_.net_Winforms_Design Patterns_Mvp - Fatal编程技术网

C# MVP:第三方控制,视图层中可以放置多少逻辑

C# MVP:第三方控制,视图层中可以放置多少逻辑,c#,.net,winforms,design-patterns,mvp,C#,.net,Winforms,Design Patterns,Mvp,我正在学习MVP模式,但仍有一些疑问 在他的MVC/MVP概述中写道: 在MVP中,视图成为一个超薄组件,其目的纯粹是向用户提供演示。视图捕获并处理用户引发的事件,但将这些事件直接转发给知道如何处理这些事件的演示者 但是,使用MVP,视图会捕获引发的事件并将其转发给控制器演示者 按钮和文本框也可以,但如果有更复杂的控件怎么办?假设我使用的是第三方组件,比如Devexpress的TreeList控件。假设我希望在用户单击expand button+时以友好方式构建子节点。不使用任何模式,我可以这

我正在学习MVP模式,但仍有一些疑问

在他的MVC/MVP概述中写道:

在MVP中,视图成为一个超薄组件,其目的纯粹是向用户提供演示。视图捕获并处理用户引发的事件,但将这些事件直接转发给知道如何处理这些事件的演示者

但是,使用MVP,视图会捕获引发的事件并将其转发给控制器演示者

按钮和文本框也可以,但如果有更复杂的控件怎么办?假设我使用的是第三方组件,比如Devexpress的TreeList控件。假设我希望在用户单击expand button+时以友好方式构建子节点。不使用任何模式,我可以这样编码:

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那样直接传递给演示者对象,因为这会影响演示者的某些视图内容

我的问题是:我能在视图层中放入多少逻辑?例如,下面显示的代码是否正常

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();
}
我认为视图负责处理这个问题。MVPMC的思想是,您可以切换到其他视图,而无需更改Model&Presenter(至少理论上是如此);。这样视图逻辑就可以像您所做的那样留在视图层。 在你的例子中,有一件事我不同意,那就是对演示者的引用。你应该做相反的事情。演示者必须具有对视图和模型对象的引用。在这种情况下,视图调用它的事件,而Presenter已经监听该事件,Presenter返回要查看的节点数组。