.net 我应该如何使用Model View Presenter模式实现IsDirty的UI?

.net 我应该如何使用Model View Presenter模式实现IsDirty的UI?,.net,model-view-controller,mvp,.net,Model View Controller,Mvp,我想有一个保存按钮,它只在视图为dirty时启用。我应该如何处理这个问题 我的特殊情况是使用.NET2.0的WinForms应用程序。我有一个演示者调用的服务层。服务层返回一个屏幕绑定的DTO 将视图绑定到此DTO并让DTO实现isDirty属性可以吗?或者我应该将数据从DTO卸载到另一个专门为演示目的而设计的对象中,例如viewmodel吗?视图不应该是脏的。只有你的模特 然后,您只需在模型变脏时触发一个事件,在模型变干净时触发一个事件。那么,您可以让所有控件在调用_presenter.Mar

我想有一个保存按钮,它只在视图为dirty时启用。我应该如何处理这个问题

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


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

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


然后,您只需在模型变脏时触发一个事件,在模型变干净时触发一个事件。

那么,您可以让所有控件在调用_presenter.MarkDirty()或类似方法时启用更改自动回发功能吗

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

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

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

更新:


CSLA与业务层无关吗

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

此外,您还可以使用CSLA作为DTO和表示层之间的中间层,尽管如果您只想使用IsDirty功能,这会有点太多开销


要点是:当您开始将“功能”放入DTO时,我不明白您为什么不从业务层公开CSLA对象而不是简单的DTO。以下是我所做的,视图本身可以跟踪用户是否尝试修改数据。发生这种情况时,它可以通知演示者视图数据已更改,演示者可以对此事件执行操作以启用/禁用“保存”按钮。这是迄今为止我发现的最简单的解决方案,否则您必须对DTO/数据对象本身进行更改跟踪。

“MVP”非常广泛。。。什么平台/语言/体系结构?@Marc希望这能提供更多细节,让您能够给出一些回答这是我最初的想法。模型会变脏,视图可以反映这一事实。因此,我假设模型必须实现isdirty属性。Autopost back可能不是WinForms中最正确的词,但它至少应该传达我的观点。CSLA与业务层无关吗?我提出的问题是关于演讲的。我的业务对象不向表示层公开。@我同意,只要我将isDirty属性放入DTO,它就不再是DTO。因此,在此基础上,我假设这样做确实是错误的,这就是为什么我问这样做是否会是从DTO中提取数据并将其推入另一个对象以进行表示的情况。我的特定实现没有向表示层公开域对象,因为我非常喜欢这种方法,尽管我知道在这个问题上有很多争论。