PropertyPath XAML 語法

PropertyPath物件支援複雜的內嵌 XAML 語法,以設定將 PropertyPath 型別作為其值的各種屬性。 本主題記載套用 PropertyPath 至系結和動畫語法的語法。

PropertyPath 的用途

PropertyPath 是用於數個功能的一般物件 Windows Presentation Foundation (WPF) 。 儘管使用常見的 PropertyPath 來傳達屬性路徑資訊,但作為類型的每個功能區域的使用 PropertyPath 方式會有所不同。 因此,依功能來說明語法會比較實際。

主要是 WPF 用 PropertyPath 來描述物件模型路徑,以用於遍歷物件資料來源的屬性,以及描述目標動畫的目標路徑。

某些樣式和範本屬性,例如 Setter.Property 採用類似的完整屬性名稱 PropertyPath 。 但這不是真正的, PropertyPath 而是符合資格的 擁有者。 WPF 處理器啟用的屬性字串格式使用方式, XAML 與的類型轉換器組合 DependencyProperty

資料繫結中物件的 PropertyPath

資料繫結是一個 WPF 功能,您可藉以繫結至任何相依性屬性的目標值。 不過,這類資料繫結的來源不需要是相依性屬性;它可以是適用的資料提供者所能辨識的任何屬性類型。 屬性路徑特別適用于 ObjectDataProvider ,後者是用來從 common language runtime (CLR) 物件及其屬性取得系結來源。

請注意,XML 的資料系結不會使用 PropertyPath ,因為它不 Path 會在中使用 Binding 。 相反地,您可以使用 XPath 並指定有效的 XPath 語法到 XML 檔物件模型 (DOM) 的資料。 XPath 也會指定為字串,但不記載于此處;請參閱 使用 XMLDataProvider 和 XPath 查詢系結至 XML 資料

若要了解資料繫結中的屬性路徑,關鍵在於您可以將繫結的目標設為個別的屬性值,也可以改為繫結至要取得清單或集合的目標屬性。 如果您要系結集合,例如系結, ListBox 將根據集合中有多少資料項目來展開,則屬性路徑應該參考集合物件,而不是個別的集合專案。 資料系結引擎會自動將用來做為資料來源的集合與系結目標的型別進行比對,因而產生像是以 ListBox items 陣列填入的行為。

直接物件上做為資料內容的單一屬性

<Binding Path="propertyName" ... />

propertyName 必須解析為目前中所使用之屬性的名稱 DataContext Path 。 如果您的繫結會更新來源,則該屬性必須是讀取/寫入屬性,且來源物件必須是可變動的。

直接物件上做為資料內容的單一索引子

<Binding Path="[key]" ... />

key 必須是對字典或雜湊表之具類型的索引,或是陣列的整數索引。 此外,索引鍵值的類型必須是可直接繫結至要套用它的屬性。 例如,包含字串索引鍵和字串值的雜湊表可以用這種方式系結至的文字 TextBox 。 或者,如果索引鍵指向集合或子索引,您可以使用此語法來繫結至目標集合屬性。 否則,您需要透過語法 (例如 <Binding Path="[key].propertyName" .../>) 來參考特定的屬性。

您可以視需要指定索引的類型。 如需有關索引屬性路徑之這個方面的詳細資訊,請參閱 Binding.Path

多個屬性 (間接屬性目標設定)

<Binding Path="propertyName.propertyName2" ... />

propertyName 必須解析為目前的屬性名稱 DataContext 。 路徑屬性 propertyNamepropertyName2 可以是存在於關聯性中的任何屬性,其中 propertyName2 是存在於值為 propertyName 之類型中的屬性。

單一屬性 (附加或類型限定)

<object property="(ownerType.propertyName)" ... />

括弧指出中的這個屬性 PropertyPath 應該使用部分限定性來建立。 它可以使用 XML 命名空間來尋找具有適當對應的類型。 您 ownerType XAML 可以透過 XmlnsDefinitionAttribute 每個元件中的宣告,來搜尋處理器可以存取的類型。 大部分的應用程式都有對應至 http://schemas.microsoft.com/winfx/2006/xaml/presentation 命名空間的預設 XML 命名空間,因此,前置詞通常只需用於自訂類型或該命名空間以外的類型。 propertyName 必須解析為存在於 ownerType 上的屬性名稱。 此語法通常用於下列其中一種情況:

  • 指定於 XAML 中的路徑,其位於不具指定目標類型的樣式或範本中。 除此之外,限定用法通常是無效的,因為在非樣式和非範本的情況中,屬性會存在於執行個體上,而非類型上。

  • 屬性是附加屬性。

  • 您要繫結至靜態屬性。

為了作為分鏡腳本目標,指定為的屬性 propertyName 必須是 DependencyProperty

來源周遊 (繫結至集合的階層)

<object Path="propertyName/propertyNameX" ... />

此語法中的 / 是用來在階層式資料來源物件內進行巡覽,並支援含有連續 / 字元之階層的多個步驟。 來源周遊負責目前的記錄指標位置,這是藉由將資料與其檢視的 UI 同步處理來判斷。 如需與階層式資料來源物件繫結的詳細資訊,以及資料繫結中目前記錄指標的概念,請參閱使用含階層式資料的主從式模式資料繫結概觀

注意

在表面上,這個語法類似 XPath。 系結至 XML 資料來源的真正 XPath 運算式不會用來當做 Path 值,而且應該改為用於互斥 XPath 屬性。

集合檢視

若要參考具名的集合檢視,請在集合檢視名稱前面加上雜湊字元 (#)。

目前的記錄指標

若要參考集合檢視的目前記錄指標或是一對多資料繫結案例,請以正斜線 (/) 做為路徑字串的開頭。 任何超過正斜線的路徑,都會從目前的記錄指標開始周遊。

多個索引子

<object Path="[index1,index2...]" ... />

<object Path="propertyName[index,index2...]" ... />

如果特定物件支援多個索引子,就可依順序指定那些索引子,類似陣列參考語法。 上述物件可以是目前的內容,或是包含多重索引物件的屬性值。

根據預設,索引子值是使用基礎物件的特性來輸入。 您可以視需要指定索引的類型。 如需輸入索引子的詳細資訊,請參閱 Binding.Path

混合語法

上述語法可穿插使用。 例如,下列範例會在屬性的特定 x、y 上建立色彩的屬性路徑, ColorGrid 其中包含物件的圖元方格陣列 SolidColorBrush

<Rectangle Fill="{Binding ColorGrid[20,30].SolidColorBrushResult}" ... />

屬性路徑字串的逸出

對於某些商務物件,您可能會遇到屬性路徑字串需要逸出序列,才能正確剖析的情況。 需要逸出的情況應該相當罕見,因為在通常用來定義商務物件的語言中,這其中許多字元都有類似的命名互動問題。

  • 在索引子 ([ ]) 內,插入號字元 (^) 會逸出下一個字元。

  • 您必須將專屬於 XML 語言定義的某些字元逸出 (使用 XML 實體)。 使用 & 逸出 "&" 字元。 使用 > 逸出 ">" 結束標記。

  • 您必須將專屬於用來處理標記延伸之 WPF XAML 剖析器行為的字元逸出 (使用反斜線 \)。

    • 反斜線 (\) 本身是逸出字元。

    • 等號 (=) 會分隔屬性名稱和屬性值。

    • 逗號 (,) 會分隔屬性。

    • 右大括號 (}) 是標記延伸的結尾。

注意

技術上來說,這些逸出也適用於分鏡腳本屬性路徑,但您通常會周遊現有 WPF 物件的物件模型,因此應該不需要逸出。

動畫目標的 PropertyPath

動畫的 target 屬性必須是採用或基本類型的相依性屬性 Freezable 。 不過,類型上的目標屬性和最終動畫屬性可存在於不同物件上。 對動畫來說,屬性路徑是用來定義具名動畫目標物件的屬性與所需目標動畫屬性之間的關係,方法則是周遊屬性值中的物件-屬性關聯性。

動畫的一般物件-屬性考量

如需一般動畫概念的詳細資訊,請參閱分鏡腳本概觀動畫概觀

實值型別或正在動畫的屬性必須是 Freezable 類型或基本類型。 啟動路徑的屬性必須解析為存在於指定類型上之相依性屬性的名稱 TargetName

為了支援為已經凍結的建立動畫的複製 Freezable 功能,所指定的物件 TargetName 必須是 FrameworkElement 或衍生的 FrameworkContentElement 類別。

目標物件上的單一屬性

<animation Storyboard.TargetProperty="propertyName" ... />

propertyName 必須解析為存在於指定類型上之相依性屬性的名稱 TargetName

間接屬性目標

<animation Storyboard.TargetProperty="propertyName.propertyName2" ... />

propertyName 必須是實 Freezable 數值型別或基本類型的屬性,該屬性存在於指定的型別上 TargetName

propertyName2 必須是存在於值為 propertyName 之物件上的相依性屬性名稱。 換句話說, propertyName2 必須以型別的相依性屬性的形式存在於 propertyName PropertyType

由於已套用樣式和範本,因此需要間接設定動畫的目標。 若要將動畫設為目標,您需要一個 TargetName 目標物件上的,且該名稱是由 x:Name 或所建立 Name 。 雖然範本和樣式元素也可以有名稱,但那些名稱只在樣式和範本的名稱範圍內有效 (如果範本和樣式會與應用程式標記共用名稱範圍,則名稱不能是唯一的。 樣式和範本實際上是在實例之間共用,而且會永久保存重複 ) 的名稱。因此,如果您可能想要建立動畫之專案的個別屬性來自于樣式或範本,您需要從不是來自樣式範本的命名元素實例開始,然後將目標設為樣式或範本視覺化樹狀結構,以到達您想要建立動畫的屬性。

例如,的 Background 屬性 Panel 是一個完整的 Brush (實際上是 SolidColorBrush 來自主題範本的) 。 若要完全建立動畫 Brush ,必須有一個 BrushAnimation (可能是每個類型) 都有一個, Brush 而且沒有這種類型。 若要建立筆刷的動畫,您可以改為以動畫顯示特定類型的屬性 Brush 。 您必須從中取得, SolidColorBrush 才能在 Color ColorAnimation 該處套用。 此範例的屬性路徑就是 Background.Color

附加屬性

<animation Storyboard.TargetProperty="(ownerType.propertyName)" ... />

括弧指出中的這個屬性 PropertyPath 應該使用部分限定性來建立。 它可使用 XML 命名空間來尋找此類型。 您 ownerType XAML 可以透過 XmlnsDefinitionAttribute 每個元件中的宣告,來搜尋處理器可以存取的類型。 大部分的應用程式都有對應至 http://schemas.microsoft.com/winfx/2006/xaml/presentation 命名空間的預設 XML 命名空間,因此,前置詞通常只需用於自訂類型或該命名空間以外的類型。 propertyName 必須解析為存在於 ownerType 上的屬性名稱。 指定為的屬性 propertyName 必須是 DependencyProperty 。 (所有 WPF 附加屬性都會實作為相依性屬性,因此只有自訂附加屬性才會發生此問題)。

索引子

<animation Storyboard.TargetProperty="propertyName.propertyName2[index].propertyName3" ... />

大部分的相依性屬性或 Freezable 類型都不支援索引子。 因此,若要在動畫路徑中使用索引子,就只能在具名目標上開始鏈結的屬性與最終動畫屬性之間的中繼位置上使用。 在所提供的語法中,就是 propertyName2。 比方說,如果中繼屬性是的集合(例如 TransformGroup ),則在屬性路徑(例如)中,可能需要索引子的使用方式 RenderTransform.Children[1].Angle

程式碼中的 PropertyPath

的程式碼使用 PropertyPath 方式(包括如何建立) PropertyPath 記錄在的參考主題中 PropertyPath

一般來說, PropertyPath 是設計來使用兩個不同的函式,一個用於系結使用方式和最簡單的動畫使用方式,另一個用於複雜的動畫使用方式。 使用簽章來系結使用方式 PropertyPath(Object) ,其中的物件為字串。 使用 PropertyPath(Object) 單一步驟動畫路徑的簽章,其中物件是 DependencyProperty 。 使用複雜動畫的簽章 PropertyPath(String, Object[]) 。 後面這個建構函式會針對第一個參數使用語彙基元字串,並使用物件陣列來填滿語彙基元字串中的位置,以定義屬性路徑關聯性。

另請參閱