共用方式為


TypeConverter 和 XAML

更新:2007 年 11 月

若 Managed 自訂類別可當做可延伸標記語言 (XAML) 屬性 (Attribute) 使用方式中的屬性 (Property) 值,TypeConverter 類別所提供的特定用途即可充當此種自訂類別的實作一部分。撰寫自訂類別時,如果要將類別的執行個體當做可延伸標記語言 (XAML) 的可設定屬性 (Attribute) 值使用,您可能必須將 TypeConverterAttribute 套用至類別、撰寫自訂 TypeConverter 類別,或同時進行這兩個動作。

這個主題包含下列章節。

  • XAML 和字串值
  • 實作型別轉換子
  • 套用 TypeConverterAttribute
  • 相關主題

XAML 和字串值

在 XAML 中設定屬性 (Attribute) 值時,該屬性值的初始型別為 String。甚至連其他基本型別 (例如 Double) 一開始都是 XAML 處理器的字串,不過由於內建型別轉換的緣故,轉換成其他非字串的基本值或是從列舉型別的具名值進行轉換都非常簡單。

XAML 處理器需要有兩項資訊才能處理屬性值。第一項資訊是所要設定之屬性的實值型別。定義屬性值且以 XAML 處理的任何字串最終都必須轉換或解析成該型別的值。如果值是基本型別,會嘗試直接轉換字串;如果值是列舉型別,則會使用字串來檢查該列舉型別中的相符名稱;而如果值不是基本型別也不是列舉型別,則相關型別必須能夠提供型別的執行個體或提供值 (根據轉換後的字串而定)。

標記延伸是特例。標記延伸的使用必須在檢查屬性 (Property) 型別和其他考量因素之前由 XAML 處理器進行處理。一般而言,標記延伸的目的是要處理字串並傳回物件。如果傳回的物件是屬性的型別相符項目,標記延伸便會使用可避免在標記延伸實作程式碼以外進行型別轉換的方式,提供屬性的值。需要使用標記延伸的其中一種常見的情況是建立已經存在之物件的參考 (最佳的情況是沒有狀態 (Stateless) 的型別轉換子可能只會產生新的執行個體,而這可能並非您想要的結果)。如需標記延伸的詳細資訊,請參閱標記延伸和 XAML

TypeConverter

如果值不是基本型別或列舉型別,而且也沒有使用標記延伸,則必須有某種方法可以在處理 XAML 時將 String 轉換成適當的值或新的執行個體。這是 TypeConverter 實作所扮演的角色。TypeConverter 定義了四個與字串轉換有關的成員,以供 XAML 處理目的之用:

其中,最重要的方法是 ConvertFrom。這個方法會將輸入字串轉換成必要的物件型別。

第二重要的方法是 ConvertTo。如果 WPF 應用程式已轉換為標記表示 (例如儲存為 XAML),ConvertTo 便會負責產生標記表示。

CanConvertToCanConvertFrom 則是在服務查詢 TypeConverter 實作的功能時所使用的支援方法。在特定情況下,您必須執行這兩種方法來傳回 true,特別是 String 型別。

實作型別轉換子

實作 ConvertFrom

為了要當做支援 XAML 的 TypeConverter 實作使用,該轉換子的 ConvertFrom 方法必須接受以字串做為 value 參數。如果字串的格式有效,而且可以透過 TypeConverter 實作進行轉換,則傳回的物件必須支援轉型為屬性 (Property) 所預期的型別。否則,ConvertFrom 實作就必須傳回 null。

每個 TypeConverter 實作對於有效字串的組成可以有各自的詮譯,而且也可以使用或忽略當做參數傳遞的型別描述或文化特性內容。不過,WPF XAML 處理可能不會在所有情況中都傳遞值給型別描述內容,也可能不會根據 xml-lang 傳遞文化特性。

注意事項:

請勿使用大括弧字元做為字串格式的可能項目,尤其是 {。這些字元是進入及結束標記延伸序列的保留字元。

實作 ConvertTo

ConvertTo 可能用於序列化支援。自訂型別的序列化支援並不是絕對必要的一項需求。不過,如果您要實作控制項,或是使用序列化做為類別功能或設計的一部分,則應該實作 ConvertTo

為了要當做支援 XAML 的 TypeConverter 實作使用,該轉換子的 ConvertTo 方法必須接受支援型別的執行個體 (或值) 做為 value 參數。若 destinationType 參數的型別是 String,則傳回的物件必須能夠轉型為 String。傳回的字串必須代表 value 的序列化值。理想狀況下,如果該字串已傳遞至同一個轉換子的 ConvertFrom 實作,則您選擇的序列化格式應該能夠產生相同的值,以免造成資訊的重大流失。

如果值無法序列化,或是轉換子不支援序列化,ConvertTo 實作必須傳回 null,而且可以在這種情況下擲回例外狀況 (Exception)。

如果 destinationType 參數的型別不是 String,您可以選擇自己的轉換子處理。一般而言,您會重新採用基底實作處理。

每個 TypeConverter 實作對於有效字串的組成可以有各自的詮譯,而且也可以使用或忽略當做參數傳遞的型別描述或文化特性內容。

注意事項:

請勿使用大括弧字元做為字串格式的可能項目,尤其是 {。這些字元是進入及結束標記延伸序列的保留字元。

實作 CanConvertTo

您的 CanConvertTo 實作應該針對型別 String 的 destinationType 傳回 true,否則便會交由基底實作處理。

實作 CanConvertFrom

您的 CanConvertFrom 實作應該針對型別 String 的 sourceType 傳回 true,否則便會交由基底實作處理。

套用 TypeConverterAttribute

為了將自訂型別轉換子當做自訂類別的作用型別轉換子使用,您必須將 .NET Framework 屬性 (Attribute) TypeConverterAttribute 套用到類別定義。您透過屬性 (Attribute) 指定的 ConverterTypeName 必須是自訂型別轉換子的型別名稱。套用此屬性 (Attribute) 之後,當 XAML 處理器處理值時,若屬性 (Property) 型別使用您的自訂類別型別,該處理器便可輸入字串並傳回物件執行個體。

您也可以針對個別的屬性提供型別轉換子。請將 .NET Framework 屬性 TypeConverterAttribute 套用到屬性 (Property) 定義 (主要定義,不是主要定義內的 get/set 實作),而不要套用到類別定義。屬性的型別必須符合自訂型別轉換子所處理的型別。套用此屬性 (Attribute) 之後,XAML 處理器就可以在處理該屬性 (Property) 的值時,處理輸入字串並傳回物件執行個體。如果您選擇使用來自 Microsoft .NET Framework 或其他程式庫的屬性型別,而無法控制類別定義,也無法套用 TypeConverterAttribute,則根據個別屬性提供型別轉換子的方法特別有用。

請參閱

概念

XAML 概觀

標記延伸和 XAML

XAML 語法術語

參考

TypeConverter