我应该如何使用Model-View-Presenter模式为IsDirty实现UI?

时间:2009-12-30 20:30:27

标签: .net model-view-controller mvp

我想要一个仅在视图为脏时启用的保存按钮。我该怎么做呢?

我的特殊情况是使用.Net 2.0的WinForms应用程序。我有一个演示者调用的服务层。服务层返回屏幕绑定DTO。

将视图绑定到此DTO并让DTO实现isDirty属性是否可以?或者我应该将数据从DTO卸载到专门为演示目的而设计的另一个对象,例如视图模型?

4 个答案:

答案 0 :(得分:6)

视图永远不应该是脏的。只有你的模特。

然后你可以简单地让一个事件在你的模型变脏时触发,一个事件在它变得干净时触发。

答案 1 :(得分:1)

以下是我的工作,视图本身可以跟踪用户是否尝试修改数据。发生这种情况时,它可以通知演示者视图数据已更改,并且演示者可以对此事件执行操作以启用/禁用保存按钮。这是迄今为止我发现的最简单的解决方案,否则您必须对DTO / Data对象本身进行更改跟踪。

答案 2 :(得分:0)

您是否可以让所有控件在启用更改时自动回发,并调用_presenter.MarkDirty()或类似的方法。

或者您可以允许使用保存按钮,但如果对象是干净的,则使用无更改对话框或类似对象进行响应。

答案 3 :(得分:0)

我同意@Pace只有模型应该是脏的。

我只想在这里添加(因为这似乎是关于.net),您可以使用CSLA来实现您的模型,并且您可以免费获得IsDirty功能(以及许多其他功能)

<强>更新

  

CSLA不是关于业务层吗?

确实如此,但我认为IsDirty方法属于业务层。您谈到在DTO上实现IsDirty,但是当您这样做时,该对象不再是DTO(因为它不仅仅是传输数据)。

此外,你可以使用CSLA作为你的DTO和你的表示层之间的中间层,虽然如果你的意图只是使用IsDirty功能,这将是一个太多的开销。

重点是:当您开始将“功能”放入DTO时,我不明白为什么您不会从业务层中公开CSLA对象而不是简单的DTO。