2010-07-16 96 views
0

在WPF中,最好創建一個屬性「複雜」(即類型爲「可見性」)或屬性簡單(即類型爲布爾型),然後使用轉換器綁定屬性?第一種方法寫得較短,但我不知道什麼是更好的表現。WPF簡單屬性與複雜屬性

+0

請舉一個例子 – Ozan 2010-07-16 10:18:50

回答

6

使用轉換器的性能受到的影響可以忽略不計。但是,您應該根據自己的選擇確定實施該屬性的位置。

A Visibility屬性只對UI層(自定義控件或可能是視圖模型)中的類有意義。如果你在模型類上創建一個屬性,剛剛發生驅動你的用戶界面在這種情況下,使用布爾和轉換器會更有意義。

編輯:加入(略做作)例如

例如,假設你有稱爲Foo可編輯對象數據類(模型),和一個Foo可以是「簡單的」或「先進。 「 「高級」Foo將在UI中顯示額外的編輯控件 - 因此我們需要將高級編輯面板的Visibility屬性綁定到某個屬性。

您的Foo類可能有一個屬性來指示它是否先進。該屬性應該肯定是一個布爾值 - 不是Visibility - 因爲你的Foo類不應該關心顯示它的UI的任何細節。所以布爾型Foo.IsAdvanced將是一個合適的屬性。

在這種情況下,您可以直接綁定到Foo.IsAdvanced並使用轉換器。你明確不要想做的是創建一個Visibility屬性Foo.AdvancedEditControlVisibility,因爲Foo應該是後端數據類。

如果你想創建一個不需要轉換器的屬性,你應該創建一個屬性在一個更高的類中,一個屬於你的UI。有些體系結構模式會將其稱爲「ViewModel」類 - 它是一種以數據更適合UI顯示的方式呈現模型的類。因此,您可以創建一個需要Foo的類,並根據的Foo.IsAdvanced的值顯示AdvancedEditControlVisibility屬性

在這種情況下,您可以直接綁定到視圖模型上的屬性,無需轉換器。請注意,最終你已經完成了轉換 - 你只是將它作爲代碼的一個更明確的部分,而不是侷限於標記。

這裏的思考過程是viewmodel是一個「更高級別」的類 - 一個包裝你的數據類,包括UI特定的邏輯 - 所以更適合包含特定於你的UI的代碼。理想情況下,您應該輪流進行每個類的項目並確保其具有特定目的:如果Foo是一個用於存儲數據的業務對象,爲什麼它應該公開(甚至關心!)某些項目的可見性UI用來顯示它?如果您將Foo放入命令行應用程序或Web應用程序中,會發生什麼情況?如果您在業務類中使用了WPF-UI特定的邏輯,那麼您的封裝是錯誤的 - 但以這種方式分離問題是有時需要解決的最困難的事情之一。

性能方面你會發現幾乎沒有區別。:-)

+0

好的,非常感謝,但你能告訴我爲什麼你說「它會更有意義的使用布爾和轉換器」 – lamarmora 2010-07-16 10:40:36

+0

已經添加了一個相當冗長的例子,希望解釋: - )當我說「它更有意義」時,我的意思是通過在類/層之間適當分離關注點來製作好的可重用架構。 – 2010-07-16 12:17:31

+0

雅確實很長:) – akjoshi 2010-07-16 12:27:46

2

如果問題是關於性能的話,那麼第一個選項在第二個選項中的速度可以忽略不計,因爲後者涉及裝箱/取消裝箱。

但是,建議您使用convertersDataTriggers來確定屬性Data-Oriented並相應地更改視圖。

1

我不認爲這兩個選項中的任何一個都會有主要的性能問題。 更重要的是誰將是該物業的最終用戶。

在我的項目中,我們在屬性網格中向用戶顯示這些類型的屬性;因此具有布爾屬性更有意義,因此它顯示爲用戶的複選框。

如果我們使用Visibility屬性,那麼它將顯示爲具有可見,隱藏和摺疊選項的組合框。這可能會讓非技術用戶感到困惑。如丹說的 - 如果你的屬性是在viewmodel /表示層中聲明的,只有你將在視圖(xaml或代碼)中使用這個屬性,那麼擁有複雜屬性更有意義。所以你可以直接綁定。但如果你正在做其他地方說你的BL,那麼把它作爲bool更有意義。