2009-12-30 32 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對象本身進行更改跟蹤。