屬性編輯架構
視覺化編輯物件屬性是 WPF Designer for Visual Studio 的一項重要功能。 本主題將說明 WPF Designer屬性編輯系統的架構。
屬性項目
PropertyEntry 類別代表屬性本身。 PropertyValue 類別代表屬性的基礎值。
分類編輯器
「分類編輯器」(Category Editor) 可讓使用者同時編輯某一分類中的多個屬性。 與分類編輯器相關聯的屬性不會顯示在 [屬性] 視窗中的其他地方。 不是由該分類編輯器編輯的屬性將可看見和編輯。 您可以指定分類內的哪些屬性由分類編輯器進行編輯。
屬性值編輯器
「屬性值編輯器」(Property Value Editor) 會定義特定型別如何在視覺化設計工具的 [屬性] 視窗中顯示和編輯。 屬性值編輯器在 WPF Designer中的角色,就類似於 UITypeEditor 類別在 System.ComponentModel 架構中的角色。 不過,WPF Designer編輯器獨立於 System.ComponentModel 和 Windows Form 架構之外。
PropertyValueEditor 的組件如下表所列。
屬性值編輯器組件 |
描述 |
---|---|
內嵌編輯器 (也稱為「檢視」(View)) |
在裝載 [屬性] 視窗中,與檢視裝載於相同實體空間的編輯器。 例如,Margin 屬性編輯器。 |
擴充編輯器 |
通常未就地裝載的編輯器。 這相當於 System.ComponentModel 架構中的下拉式樣式編輯器。 例如,HorizontalAlignment 屬性編輯器。 |
對話方塊 |
在自己的對話方塊中實作的編輯器。 例如,RowDefinitions 屬性編輯器。 |
檢視和內嵌編輯器組件可以使用預設值。 提供擴充編輯器組件不需要 PropertyValueEditor。
每個組件都是一個 WPF DataTemplate。 每個組件都是獨立於其他組件存在,可以單獨使用。
裝載 [屬性] 視窗會提供框住檢視和編輯器的框架。 這可讓主應用程式在多個編輯器之間提供一致的樣式,並可讓不同的主應用程式提供不同的樣式。 例如,Expression Blend 和 Visual Studio 便為各自的 [屬性] 視窗提供不同的外觀和行為。
WPF 資料繫結和標準的一組 WPF RoutedCommand 物件則提供主應用程式和 PropertyValueEditor 組件之間的溝通機制。
在最簡單的情況下,值編輯器組件可以是包含標準 WPF 控制項的 DataTemplate。 在較為複雜的情況下,型別組件則可以是參考自訂控制項的 DataTemplate。
您可以實作三種不同的屬性值編輯器,如下表所列。
屬性值編輯器類型 |
描述 |
---|---|
簡易 |
屬性值編輯器包含內嵌編輯器。 |
擴充 |
屬性值編輯器包含內嵌編輯器和擴充編輯器。 |
對話方塊 |
屬性值編輯器包含內嵌編輯器和對話方塊。 |
基礎結構類別
任何屬性值編輯器實作都需要基礎結構類別。 這些類別列於下表,其中包含裝載或撰寫值編輯器的核心基礎結構。
基礎結構類別 |
描述 |
---|---|
表示屬性的值。 |
|
值編輯器的基底類別 (Base Class)。 |
|
RoutedCommand 型別和這些命令的處理常式的預設實作。 |
|
對話方塊值編輯器的抽象基底類別。
|
屬性值編輯器實作
下列章節說明實作屬性值編輯器的方式。
Value、StringValue 和 Collection
PropertyValue 模型有三個屬性與屬性的值相關。 PropertyValue 屬性列於下表。
PropertyValue 屬性 |
描述 |
---|---|
資料的物件表示。 |
|
資料的字串表示,可用於顯示或序列化 (Serialization)。 |
|
資料的集合表示。 |
StringValue 是資料的字串表示,可用於顯示或序列化。 Value 和 StringValue 會快取任何設定呼叫。
StringValue 的快取會在 Value 設定時清除。 常見的案例是支援動態更新設計的屬性 (設計為使用者型別),其中 StringValue 是繫結至文字輸入的資料。 不過,基礎屬性只有在動態文字符合某些準則時才會設定。
PropertyValueEditor 需求
正確實作的屬性值編輯器必須符合下列需求。
屬性值編輯器在設計時,必須讓內嵌編輯器和擴充編輯器組件能夠單獨使用。
屬性值編輯器不能儲存狀態。 屬性值編輯器是沒有狀態 (Stateless) 的、可由主應用程式實作快取,而且可在多個屬性值之間重複使用。
屬性值編輯器不能假設在指定時間只有一個值編輯器組件 (檢視/內嵌/擴充) 控制項作用中。 例如,對話方塊可能會有檢視組件、內嵌組件和擴充 UI 組件同時作用中。
做為屬性值編輯器一部分實作的控制項不能儲存狀態。 做為值編輯器一部分實作的控制項不應假設它只會繫結至一個屬性值。 控制項可回收來變更不同的屬性值。 如果資料模型更新,快取的任何資訊都應清除。
做為屬性值編輯器一部分實作的控制項不能對主應用程式或其父控制項做任何假設。 應使用的溝通機制只能有 PropertyValue 資料模型、藉由 DataContext,以及標準的一組命令。