Синтаксис Property-path

Класс PropertyPath и синтаксис строки можно использовать для создания экземпляра значения PropertyPath в XAML или в коде. Значения PropertyPath используются при привязке данных. Похожий синтаксис используется для нацеливания на анимации раскадровки. В обоих сценариях путь к свойству описывает обход одной или нескольких связей "объект-свойство", которые в конечном счете становятся одним свойством.

Строку пути к свойству можно задать непосредственно для атрибута в XAML. Тот же синтаксис строки можно использовать для создания PropertyPath, который задает Binding в коде, или для задания цели анимации в коде с помощью SetTargetProperty. В среде выполнения Windows существуют две отдельные функциональные области, в которых используется путь к свойству: привязка данных и нацеливание на анимацию. При нацеливании на анимацию не создаются базовые значения Синтаксис Property-path в реализации среды выполнения Windows, информация хранится в виде строки, однако принципы обхода "объект-свойство" очень похожи. Во время привязки данных и нацеливания на анимацию путь к свойству оценивается немного по-разному, поэтому ниже приводится описание синтаксиса пути к свойству для обоих случаев.

Путь к свойству для объектов при привязке данных

В среде выполнения Windows можно выполнить привязку к целевому значению любого свойства зависимостей. Исходное значение свойства для привязки данных необязательно должно быть свойством зависимостей; оно может быть свойством в бизнес-объекте (например, классом, написанным на Microsoft .NET или C++). Либо исходный объект для значения привязки может быть существующим объектом зависимостей, уже определенным приложением. На источник можно ссылаться с помощью простого имени свойства или обхода связей "объект-свойство" в графе бизнес-объекта.

Можно выполнить привязку к отдельному значению свойства или к целевому свойству, в котором содержатся списки или коллекции. Если источником является коллекция или если путь указывает свойство коллекции, механизм привязки данных сопоставляет элементы коллекции источника с целевым объектом привязки, что приводит к такой реакции на событие, как заполнение ListBox списком элементов из коллекции источника данных без ожидания конкретных элементов в этой коллекции.

Обход графа объекта

Элементом синтаксиса, который обозначает обход связи "объект-свойство" в графе объекта, является символ точки (.). Каждая точка в строке пути к свойству обозначает разделение объекта (слева от точки) и свойства этого объекта (справа от точки). Строка проверяется слева направо, что позволяет переходить по нескольким связям "объект-свойство". Рассмотрим пример:

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

Вот как оценивается этот путь.

  1. В объекте контекста данных (или объекте Source, указанном тем же классом Binding) осуществляется поиск свойства с именем Customer.
  2. В объекте, который является значением свойства Customer, осуществляется поиск свойства с именем Address.
  3. В объекте, который является значением свойства Address, осуществляется поиск свойства с именем StreetAddress1.

На каждом этапе значение обрабатывается как объект. Тип результата проверяется, только если привязка применяется к определенному свойству. Этот пример завершится ошибкой, если Address будет просто строковым значением, которое не указывает, какая часть строки является почтовым адресом. Обычно привязка указывает на определенные вложенные значения свойств бизнес-объекта, который имеет известную и обдуманную структуру данных.

Правила для свойств в пути к свойству привязки данных

  • Все свойства, на которые ссылается путь к свойству, должны быть общедоступными в исходном бизнес-объекте.
  • Конечное свойство (свойство, которое является последним именованным свойством в пути) должно быть общедоступным и изменяемым; невозможно привязать статические значения.
  • Конечное свойство должно быть доступно для чтения и записи, если этот путь используется в качестве сведений Path для двусторонней привязки.

Индексаторы

Путь к свойству для привязки данных может включать ссылки на индексированные свойства. Это позволяет выполнить привязку к упорядоченным спискам или векторам, а также к словарям или картам. Используйте квадратные скобки символов "[]" для обозначения индексированного свойства. Содержимое этих скобок может быть целым числом (для упорядоченного списка) или не заключенной в кавычки строкой (для словарей). Также можно выполнить привязку к словарю, в котором ключ является целым числом. Можно использовать различные индексированные свойства в одном и том же пути, разделяя точкой объект и свойство.

Например, рассмотрим бизнес-объект, в котором имеется список Teams (упорядоченный список), у каждого элемента которого имеется словарь Players, в котором каждый игрок определен по фамилии. Пример пути к свойству определенного игрока во второй команде: "Teams[1]. Игроки[Смит]". (Для указания второго элемента в Teams используется значение 1, поскольку список индексирован с нуля.)

Примечание Поддержка индексирования для источников данных C++ ограничена; Дополнительные сведения см . в разделе Привязка данных.

Присоединенные свойства

Пути к свойствам могут включать ссылки на присоединенные свойства. Поскольку определяющее имя присоединенного свойства уже включает точку, любое имя присоединенного свойства необходимо заключить в круглые скобки, чтобы точка не рассматривалась как этап "объект-свойство". Например, строка, указывающая, что необходимо использовать Canvas.ZIndex в качестве пути привязки, будет выглядеть так: "(Canvas.ZIndex)". Дополнительные сведения о присоединенных свойствах см. в разделе Общие сведения о присоединенных свойствах.

Объединение синтаксиса пути к свойству

Можно объединить различные элементы синтаксиса пути к свойству в одной строке. Например, можно определить путь к свойству, который ссылается на индексированное присоединенное свойство, если источник данных имеет такое свойство.

Отладка пути к свойству привязки

Поскольку путь к свойству интерпретируется механизмом привязки и зависит от информации, которая может существовать только во время выполнения, часто необходимо выполнять отладку пути к свойству для привязки, не полагаясь на стандартную поддержку во время разработки или компилирования в средствах разработки. Во многих случаях в результате отсутствия возможности разрешить путь к свойству во время выполнения возникает пустое значение без ошибки, поскольку это намеренное резервное поведение разрешения привязки. К счастью, Microsoft Visual Studio предоставляет режим отладочного вывода, который может изолировать часть пути к свойству, указывающую на источник привязки, который невозможно разрешить. Подробнее об использовании этой функции средства разработки см. в разделе "Отладка" статьи "Подробно о привязке данных".

Путь к свойству для нацеливания на анимацию

Анимации используют нацеливание на свойство зависимостей, в котором значения раскадровки применяются при запуске анимации. Чтобы определить объект, в котором существует свойство, подлежащее анимированию, анимация нацеливается на элемент по имени (Атрибут x:Name). Часто необходимо определить путь к свойству, который начинается с объекта, определенного как Storyboard.TargetName, и заканчивается определенным значением свойства зависимостей, в котором должна применяться анимация. Этот путь к свойству используется в качестве значения для Storyboard.TargetProperty.

Подробнее о том, как задать анимацию в XAML, см. Раскадровка анимации.

Простое нацеливание

Если анимируется свойство, существующее в самом целевом объекте, и к типу этого свойства можно напрямую применить анимацию (а не к подсвойству значения свойства), можно просто присвоить имя свойству, которое анимируется, без дальнейшей квалификации. Например, если целью является подкласс Shape, такой как Rectangle, и применяется анимированный Color к свойству Fill, путь к свойству может быть "Fill".

Непрямое нацеливание на свойство

Можно анимировать свойство, которое является подсвойством целевого объекта. Другими словами, если существует свойство целевого объекта, которое само является объектом, и этот объект имеет свойства, необходимо определить путь к свойству, который будет объяснять последовательность связей "объект-свойство". При каждом указании объекта, в котором требуется анимировать подсвойство, необходимо заключать имя свойства в круглые скобки и указывать свойство в формате typename.propertyname. Например, чтобы указать, что требуется значение объекта свойства RenderTransform целевого объекта, необходимо указать (UIElement.RenderTransform) в качестве первого этапа пути к свойству. Это еще не полный путь, поскольку отсутствуют анимации, которые можно применить к значению Transform напрямую. Таким образом, в этом примере необходимо завершить путь к свойству так, чтобы конечное свойство было свойством подкласса Transform, который можно анимировать с помощью значения Double: (UIElement.RenderTransform).(CompositeTransform.TranslateX)

Указание определенного дочернего элемента в коллекции

Чтобы указать дочерний элемент в свойстве коллекции, можно использовать числовой индексатор. Используйте символы "[]" в квадратных скобках вокруг целочисленного значения индекса. Можно ссылаться только на упорядоченные списки; на словари ссылаться нельзя. Поскольку коллекция не является значением, которое можно анимировать, использование индексатора не может быть конечным свойством в пути к свойству.

Например, чтобы указать, что вы хотите анимировать первый цвет остановки цвета в LinearGradientBrush , который применяется к свойству Background элемента управления, это путь к свойству: "(Control.Background). (GradientBrush.GradientStops) [0]. (GradientStop.Color)". Обратите внимание, что индексатор не является последним этапом в пути и что последний этап в особенности должен ссылаться на свойство GradientStop.Color элемента 0 в коллекции, чтобы применить к нему анимированное значение Color.

Анимирование присоединенного свойства

Это не частый сценарий, но присоединенное свойство можно анимировать, при условии, что оно имеет значение свойства, которое соответствует типу анимации. Поскольку определяющее имя присоединенного свойства уже включает точку, любое имя присоединенного свойства необходимо заключить в круглые скобки, чтобы точка не рассматривалась как этап "объект-свойство". Например, чтобы указать, что требуется анимировать присоединенное свойство Grid.Row в объекте, используйте путь к свойству (Grid.Row).

Примечание В этом примере значение Grid.Row является типом свойства Int32 . Его невозможно анимировать с помощью анимации Double. Вместо этого необходимо определить ObjectAnimationUsingKeyFrames с компонентами DiscreteObjectKeyFrame, где для ObjectKeyFrame.Value задано целое число, например 0 или 1.

Правила для свойств в пути к свойству нацеливания на анимацию

  • Предполагаемой начальной точкой пути к свойству является объект, определенный Storyboard.TargetName.
  • Все объекты и свойства, на которые имеются ссылки, а также путь к свойству должны быть общедоступными.
  • Конечное свойство (свойство, которое является последним именованным свойством в пути) должно быть общедоступным, доступным для чтения и записи, а также являться свойством зависимостей.
  • Конечное свойство должно иметь тип, который можно анимировать с помощью одного из множества классов типов анимации (анимации Color, анимации Double, анимации Point, ObjectAnimationUsingKeyFrames).

Класс PropertyPath

Класс PropertyPath является базовым типом свойства Binding.Path для сценария привязки.

В большинстве случаев PropertyPath можно применить в XAML, вообще не используя код. Но в некоторых случаях может потребоваться определить объект PropertyPath с помощью кода и назначить его свойству во время выполнения.

У PropertyPath имеется конструктор PropertyPath(String), но нет конструктора по умолчанию. Строка, передаваемая в этот конструктор, является строкой, которая определена с помощью синтаксиса пути к свойству, как указано ранее. Это также та же строка, которая может использоваться для назначения Path в качестве атрибута XAML. Единственным отличным API класса PropertyPath является свойство Path, которое доступно только для чтения. Это свойство можно использовать в качестве строки конструктора для другого экземпляра PropertyPath.