谁应该创建UI元素?

时间:2016-07-01 14:20:22

标签: c# winforms mvp passive-view

我有一个使用MVP的WinForms应用程序,我不完全确定如何处理我需要创建新UI元素的场景。

为了举例,假设我的视图有一个按钮,它应该打开一个新视图(Form)作为对话框。视图或演示者是应该创建新视图还是演示者的工作?

这是我的思考过程:

  1. 视图应该像UI特定操作一样创建它。但是...
  2. 演示者应该这样做,因为视图应该是被动的。但主持人不应该知道用户界面的具体细节。
  3. 这是解决这个问题的正确方法吗?

1 个答案:

答案 0 :(得分:1)

我看到过这种做法有两种不同。有趣的是,所有模式在纸面上看起来都很完美,然后实现细节显示它并不那么简单。我将举例作为MVW(模型 - 视图 - 无论如何),因为它应该在任何模式中都相似。

选项1: 绑定财产。使用WinForms这有点困难,但在WPF中效果很好。让您的按钮在演示者/控制器/视图模型上设置bool属性。然后,您的视图会根据此值显示或隐藏其UI。 UI可以覆盖所有现有UI以具有模态的外观。

选项2: 服务。介绍一个DialogService(希望你有依赖注入设置,所以添加它是微不足道的)。此服务有一个ShowDialog方法(选项)。选项可以是标题,消息,命令(带按钮的标题和操作)。让您的按钮在演示者上设置属性或触发命令,然后调用它的dialogService的ShowDialog方法。这样您的视图仍然只是简单地调用您的演示者并且它正在使用该服务。观点不应该了解服务。这允许您的DialogSevice构建适当的UI,然后启动新表单。这也是我喜欢结束本机MessageBox.Show调用的方式,因此您可以使用DialogService替换所有这些。

选项3: 不要纯粹主义者。如果您的模态不需要与演示者交互,或者您只是想要基本数据(比如颜色选择器或类似的东西)那么只需让您的视图处理它。您的按钮可以简单地打开模态,模态具有发送回视图的值。然后您的视图使用它们。如果数据没有理由将其恢复为演示者,请不要过于复杂化为纯粹主义者。视图仍然可以执行基于UI的逻辑。我将视图用于许多UI,例如使用鼠标/触摸事件移动元素或缩放到缩放计算。如果逻辑只是UI,请将其保留在视图后面的代码中。如果重复的UI逻辑将其移动到服务或用户控件或自定义视图。

在所有MVP / MVC / MVVM文档中,他们总是缺少关键细节。对我而言,服务是缺失的环节。它们允许插入松散耦合的逻辑,您可以将一些丑陋的UI绑定或UI事件包装到服务中并保持整洁。

希望这有帮助。