2009-12-30 49 views
0

我想要一个保存按钮,只有在视图isdirty时才启用。我应该如何处理这个问题?如何使用Model-View-Presenter模式实现IsDirty的UI?

我的特殊情况是使用.Net 2.0的WinForms应用程序。我有一个主讲人呼叫的服务层。服务层返回一个屏幕绑定的DTO。

将视图绑定到此DTO并让DTO实现isDirty属性可以吗?或者我应该将DTO中的数据卸载到专门用于演示目的的另一个对象中,例如视图模型?

+1

“MVP”非常广泛...什么平台/语言/体系结构? – 2009-12-30 20:32:31

+0

@Marc希望这提供了更多的细节,让你给予一些回应 – David 2009-12-30 21:13:25

回答

6

视图不应该很脏。只有你的模型。

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

+1

这是我最初的想法。该模型是什么会变得肮脏,并认为可以反映这一事实。所以我会假设模型必须实现一个isdirty属性。 – David 2009-12-30 21:09:40

0

那么你可以让你的所有控件都在自动调用_presenter.MarkDirty()或类似的方法时启用更改。

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

+0

自动加载返回可能不是WinForms中最正确的词,但它应该至少表达我的观点。 – 2009-12-30 22:31:50

0

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

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

更新:

是里昂证券不看好的业务层?

的确的,但我认为IsDirty方法属于业务层。你说的是在你的DTO上实现一个IsDirty,但是当你这么做的时候,这个对象不再是一个DTO(因为它不仅仅是传输数据)。

此外,您可以使用CSLA作为您的DTO和表示层之间的中间层,但如果您的意图只是使用IsDirty功能,则这会有点太多开销。重点是:当你开始在你的DTO中加入'功能'的时候,我不明白你为什么不公开你的业务层中的CSLA对象而不是简单的DTO。

+0

CSLA不是关于业务层的吗?我提出的问题是关于演示。我的业务对象不会暴露给表示层。 – David 2009-12-31 11:25:10

+0

@fretje我同意,只要我把一个isDirty属性放入DTO,那么它就不再是一个DTO。因此,在此基础上,我认为这样做确实是错误的,这就是为什么我问是否会从DTO中提取数据并将其推送到另一个对象用于演示目的。我的具体实现并没有将域对象暴露给表示层,因为我非常喜欢这种方法,尽管我知道这个主题有很多争论。 – David 2009-12-31 13:43:22

1

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