2008-12-10 63 views
1

我有一些實體對它們有十進制屬性。這些實體的屬性在我的UI中顯示在多個位置。抽象UI數據格式化

目前我發現自己做:

litWeight.Text = person.Weight.ToString("0.00"); 

所有的地方。 現在我知道一個事實,即在多個實例中,並且對許多其他客戶可疑,客戶端可能需要3d.p.的值。在將來。

有一些模式,我可以使用來處理這個重量屬性的格式(和其他屬性;不只是小數,也許日期等),以便我能有這樣的格式在一個地方?

我知道能在webconfig使用formatString中,或寫在UI的一些擴展方法,但這些似乎並不很優雅的解決方案。

如果有一些與我的實體綁定的格式化對象是很好的,所以它固有地明顯地使用了哪種格式化器。

感謝,

安德魯

回答

2

最簡單的解決辦法是使之與相應地格式化不同類型的值,並呼籲他們的靜態方法的實用程序類。例如:

litWeight.Text = Utility.FormatWeight(person.Weight); 
1

您是否可以不向實體添加格式化themeslves的方法?然後每個對象都可以委託給一個'策略'對象來完成實際的格式化。

一個原因是既要能夠改變小數位等,同時也爲了讓事情像國際 - 十進制格式與語言環境相關;一些國家使用十進制逗號,而不是點,或一組數字比三分球等

編輯其他組:有人評論這使演示代碼領域層。誠然,對所有設計問題應用標準修補程序;間接添加多一層:)

您可能不希望有完整的MVC,但視圖和模型的概念似乎仍然適當。也許,對於每個實體,定義一個View類,那麼PersonView保持對Person對象的引用,並且對於感興趣的Person的每個屬性都有稱爲format_weight等的屬性?它應該仍然使用實際格式的策略模式。

所以,你的例子是

PersonView pv = new PersonView(person) 

litWeight.Text = pv.format_weight(); 

(請原諒語法錯誤,我不說話C#)

如果你願意,你可以做替代PersonView下降的人,無論是通過重新實現方法/屬性和分配給引用的Person,還是在製作PersonView時從Person繼承?

+0

是的,但後來我把表現層的代碼爲這是不是很漂亮 – 2008-12-10 12:16:37

+0

是的,我曾經考慮過一個裝飾領域層,但我寧願不必委託一切,繼承並不是真正的選擇。此外,我不想要包裝每個實體只是爲了能夠呈現它。也許我最終會這樣做,我只是不能幫助感覺這裏有一個更好的解決方案... – 2008-12-10 15:29:13

1

您可以創建一個非常基本的用戶控制 - 從標籤或類似的衍生 - 這是完全負責顯示的重量字符串,所以你就必須:

weightValue.DisplayValue(person.Weight); 

,並根據需要設置器格式化小數。如果您在顯示重量時使用此項,則只需更改用戶控制即可更改所有重量顯示。

基本版本可能是:

public void DisplayValue(decimal weight) 
{ 
    this.Text = weight.ToString("0.00"); 
}