Property-path 語法

您可以使用 PropertyPath 類別和字串語法,在 XAML 或程式碼中具現化 PropertyPath 值。 PropertyPath 值是由資料繫結使用。 類似的語法用於以分鏡腳本動畫為目標。 針對這兩種案例,屬性路徑描述最終解析為單一屬性的一或多個物件屬性關聯性的周遊。

您可以直接將屬性路徑字串設定為 XAML 中的屬性。 您可以使用相同的字串語法來建構在程式碼中設定 BindingPropertyPath,或使用 SetTargetProperty 在程式碼中設定動畫目標。 Windows 執行階段中有兩個不同的功能區域使用屬性路徑:資料繫結和動畫目標。 動畫目標不會在 Windows 執行階段實作中建立基礎 Property-path 語法值,它會將資訊保留為字串,但物件屬性周游的概念非常類似。 以每個為目標的資料繫結和動畫會以稍微不同的方式評估屬性路徑,因此我們會分別針對每個屬性描述屬性路徑語法。

資料繫結中物件的屬性路徑

在 Windows 執行階段中,您可以繫結至任何相依性屬性的目標值。 資料繫結的來源屬性值不一定是相依性屬性;它可以是商業物件上的屬性 (例如以 Microsoft .NET 語言或 C++ 撰寫的類別)。 或者,繫結值的來源物件可以是應用程式已經定義的現有相依性物件。 來源可以透過簡單屬性名稱或商業物件圖形中物件屬性關聯性的周遊來參考。

您可以繫結至個別屬性值,也可以繫結至保存清單或集合的目標屬性。 如果來源是集合,或者路徑指定集合屬性,則資料繫結引擎會將來源的集合項目與繫結目標進行比對,進而導致諸如使用資料來源中的項目清單填充 ListBox 之類的行為集合,而不需要預測該集合中的特定項目。

周遊物件圖形

表示物件圖形中物件屬性關聯性周游的語法元素是點 (.) 字元。 屬性路徑字串中的每個點表示物件 (點的左側) 和該物件的屬性 (點的右側) 之間的劃分。 字串會由左至右評估,其可逐步執行多個物件屬性關聯性。 讓我們看看一個範例:

"{Binding Path=Customer.Address.StreetAddress1}"

以下是此路徑的評估方式:

  1. 在資料內容物件 (或由相同 Binding 指定的 Source)中搜尋名為「Customer」的屬性。
  2. 物件是「Customer」屬性的值,會搜尋名為「Address」的屬性。
  3. 物件是「Address」屬性的值,會搜尋名為「StreetAddress1」的屬性。

在這些步驟中,值會視為物件。 只有在繫結套用至特定屬性時,才會檢查結果的類型。 如果「Address」只是字串值,但未公開該字串的哪個部分是街道地址,則此範例會失敗。 一般而言,繫結指向具有已知和刻意資訊結構之商業物件的特定巢狀屬性值。

資料繫結屬性路徑中屬性的規則

  • 屬性路徑所參考的所有屬性都必須在來源商業物件中為公用。
  • end 屬性 (路徑中最後一個具名屬性的屬性) 必須是公用屬性,而且必須可變動 – 您無法繫結至靜態值。
  • 如果此路徑用做雙向繫結的路徑資訊,則 end 屬性必須是讀取/寫入的。

索引子

資料繫結的屬性路徑可以包含索引屬性的參考。 這可讓繫結至已排序的清單/向量,或繫結至字典/地圖。 使用方括弧「[]」字元來表示索引屬性。 這些括弧的內容可以是整數 (適用於已排序的清單) 或未批註字串 (適用於字典)。 您也可以繫結至索引鍵為整數的字典。 您可以在相同的路徑中使用不同的索引屬性,並以點分隔 object-property。

例如,考慮一個商務物件,其中有一個「Teams」清單 (有序清單),每個團隊都有一個「Players」字典,其中每個玩家都按姓氏為索引鍵。 第二個團隊特定球員的範例屬性路徑為:「Teams[1].Players[Smith]」。 (您使用 1 來指出「Teams」中的第二個項目,因為清單為零索引。)

注意:C++ 資料來源的索引支援是有限的;請參閱深入瞭解資料繫結

附加屬性

屬性路徑可以包含附加屬性的參考。 因為附加屬性的識別名稱已經包含一個點,所以您必須將任何附加屬性名稱括在括弧內,這樣點就不會被視為物件屬性步驟。 例如,指定要使用 Canvas.ZIndex 做為繫結路徑的字串是「(Canvas.ZIndex)」。 有關附加屬性的詳細資訊,請參閱附加屬性概觀

結合屬性路徑語法

您可以在單一字串中結合屬性路徑語法的各種元素。 例如,如果您的資料來源具有這類屬性,您可以定義參考索引附加屬性的屬性路徑。

偵錯繫結屬性路徑

由於屬性路徑是由繫結引擎解譯,而且依賴可能只在執行階段出現的資訊,因此您通常必須針對繫結的屬性路徑進行偵錯,而不需要依賴開發工具中的傳統設計階段或編譯階段支援。 在許多情況下,無法解析屬性路徑的執行階段結果是空白值,沒有錯誤,因為這是繫結解析的按照設計後援行為。 幸運的是,Microsoft Visual Studio 提供了一種偵錯輸出模式,可以隔離指定繫結來源的屬性路徑的哪一部分無法解析。 有關使用此開發工具功能的更多資訊,請參閱深入瞭解資料繫結的「偵錯」部分

動畫目標的屬性路徑

動畫依賴於以動畫執行時套用分鏡腳本值的相依性屬性為目標。 為了識別要動畫化的屬性所在的物件,動畫會依照名稱 (x:Name attribute) 以元素為目標。 通常需要定義一個屬性路徑,該路徑以識別為 Storyboard.TargetName 的物件開始,並以套用動畫的特定相依性屬性值結束。 此屬性路徑用做 Storyboard.TargetProperty 的值。

如需如何在 XAML 中定義動畫的詳細資訊,請參閱分鏡腳本動畫

簡單目標

如果您要以動畫顯示存在於目標物件本身的屬性,而且該屬性的類型可以直接套用至該屬性的動畫 (而不是屬性值的子屬性),則您可以直接將動畫屬性命名為無進一步資格。 例如,如果您的目標是 Shape 子類別 (例如 Rectangle),並且您要將動畫 Color 套用到 Fill 屬性,則您的屬性路徑可以是「Fill」。

間接屬性目標

您可以建立屬性的動畫效果,該屬性是目標物件的子屬性。 換句話說,如果目標物件的屬性是物件本身,而且該物件具有屬性,您必須定義屬性路徑,說明如何逐步執行該物件屬性關聯性。 每當您指定要為子屬性設定動畫的物件時,請將屬性名稱括在括號中,並以 typename.propertyname 格式指定屬性。 例如,若要指定您需要目標物件的 RenderTransform 屬性的物件值,請指定「(UIElement.RenderTransform)」做為屬性路徑中的第一步。 這還不是完整的路徑,因為沒有可以直接套用於 Transform 值的動畫。 因此,對於此範例,您現在完成屬性路徑,以便結束屬性是可以透過 Double 值進行動畫處理的 Transform 子類別的屬性:「(UIElement.RenderTransform).(CompositeTransform.TranslateX)」

指定集合中的特定下層

若要在集合屬性中指定下層項目,您可以使用數值索引子。 在整數索引值周圍使用方括弧「[]」字元。 您只能參考排序清單,而非字典。 因為集合不是可以產生動畫的值,所以索引子使用方式永遠不能是屬性路徑中的 end 屬性。

例如,若要指定要對套用於控制項的 Background 屬性的 LinearGradientBrush 中的第一個色彩停止色彩進行動畫處理,屬性路徑如下:「(Control.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)」。 請注意,索引子不是路徑中的最後一步,最後一步必須參考集合中項目 0 的 GradientStop.Color 屬性才能對其套用 Color 動畫值。

對附加屬性進行動畫處理

這不是常見案例,但可以對附加屬性進行動畫處理,只要該附加屬性具有與動畫類型相符的屬性值即可。 因為附加屬性的識別名稱已經包含一個點,所以您必須將任何附加屬性名稱括在括弧內,這樣點就不會被視為物件屬性步驟。 例如,指定要對物件上的 Grid.Row 附加屬性進行動畫處理的字串,請使用屬性路徑「(Grid.Row)」。

注意:對於此範例,Grid.Row 的值是 Int32 屬性類型。 因此您無法使用 Double 動畫來建立動畫效果。 反之,您可以定義一個具有 DiscreteObjectKeyFrame 元件的 ObjectAnimationUsingKeyFrames,其中 ObjectKeyFrame.Value 設定為整數,例如「0」或「1」。

動畫目標屬性路徑中屬性的規則

  • 屬性路徑的假設起點是 Storyboard.TargetName 所識別的物件。
  • 沿著屬性路徑參考的所有物件和屬性都必須是公用的。
  • end 屬性 (路徑中最後一個具名屬性的屬性) 必須是公用、可讀寫的,而且是相依性屬性。
  • end 屬性必須具有能夠由一大類別動畫類型 (Color 動畫、Double 動畫、Point 動畫、ObjectAnimationUsingKeyFrames) 進行動畫處理的屬性類型。

PropertyPath 類別

PropertyPath 類別是繫結案例的 Binding.Path 的基礎屬性類型。

在大部分情況下,您可以在 XAML 中套用 PropertyPath,而不需使用任何程式碼。 但在某些情況下,您可能想要使用程式碼定義 PropertyPath 物件,並在執行階段將它指派給屬性。

PropertyPath 有一個 PropertyPath (String) 建構函式,但沒有預設建構函式。 您傳遞至此建構函式的字串是使用屬性路徑語法定義的字串,如我們稍早所述。 這也是您用來將 Path 指定為 XAML 屬性的相同字串。 PropertyPath 類別唯一的其他 API 是 Path 屬性,它是唯讀的。 您可以使用這個屬性做為另一個 PropertyPath 執行個體的建構字串。