Синтаксис пути к свойству
Класс PropertyPath и строковый синтаксис можно использовать для создания экземпляра значения PropertyPath в XAML или коде. Значения PropertyPath используются привязкой данных. Аналогичный синтаксис используется для раскадровки анимаций. В обоих сценариях путь к свойству описывает обход одной или нескольких связей свойств объекта, которые в конечном итоге разрешаются в одно свойство.
Строку пути свойства можно задать непосредственно атрибуту в XAML. С помощью одного и того же синтаксиса строки можно создать PropertyPath, который задает привязку в коде или задать целевой объект анимации в коде с помощью SetTargetProperty. В среда выполнения Windows есть две отдельные области функций, которые используют путь к свойству: привязку данных и целевую анимацию. Целевой объект анимации не создает базовые значения синтаксиса property-path в реализации среда выполнения Windows, он сохраняет сведения в виде строки, но понятия обхода свойств объекта очень похожи. Привязка данных и анимация, предназначенные для каждой оценки пути свойства немного по-разному, поэтому мы описываем синтаксис пути свойств отдельно для каждого.
Путь к свойству для объектов в привязке данных
В среда выполнения Windows можно привязать к целевому значению любого свойства зависимости. Значение исходного свойства для привязки данных не должно быть свойством зависимостей; это может быть свойство бизнес-объекта (например, класс, написанный на языке Microsoft .NET или C++). Или исходный объект для значения привязки может быть существующим объектом зависимостей, уже определенным приложением. Источник можно ссылаться либо по простому имени свойства, либо путем обхода связей свойств объекта в графе объектов бизнес-объекта.
Можно привязать к значению отдельного свойства или привязать к целевому свойству, в котором содержатся списки или коллекции. Если источник является коллекцией или если путь указывает свойство коллекции, подсистема привязки данных соответствует элементам коллекции источника целевому объекту привязки, что приводит к такому поведению, как заполнение ListBox списком элементов из коллекции источников данных без необходимости предвидеть определенные элементы в этой коллекции.
Обход графа объектов
Элемент синтаксиса, обозначающий обход связи свойства объекта в графе объектов, является символом точки (.). Каждая точка в строке пути свойства указывает разделение между объектом (слева от точки) и свойством этого объекта (справа от точки). Строка вычисляется слева направо, что позволяет выполнять пошаговое выполнение нескольких связей свойств объекта. Рассмотрим пример:
"{Binding Path=Customer.Address.StreetAddress1}"
Вот как оценивается этот путь:
- Объект контекста данных (или источник, указанный в той же привязке), выполняется поиск свойства с именем Customer.
- Объект, который является значением свойства Customer, выполняется поиск свойства с именем Address.
- Объект, который является значением свойства Address, выполняется поиск свойства с именем StreetAddress1.
На каждом из этих шагов значение рассматривается как объект. Тип результата проверяется только в том случае, если привязка применяется к конкретному свойству. Этот пример завершится ошибкой, если "Адрес" был просто строковым значением, которое не предоставляло, какая часть строки была адресом улицы. Как правило, привязка указывает на определенные вложенные значения свойств бизнес-объекта, имеющего известную и преднамеренную структуру информации.
Правила свойств в пути свойства привязки данных
- Все свойства, на которые ссылается путь свойства, должны быть общедоступными в исходном бизнес-объекте.
- Конечное свойство (свойство, которое является последним именованным свойством в пути), должно быть общедоступным и должно быть изменяемым — нельзя привязать к статическим значениям.
- Конечное свойство должно быть прочитано и записано, если этот путь используется в качестве сведений о пути для двусторонней привязки.
Индексаторы
Путь к свойству для привязки данных может включать ссылки на индексированные свойства. Это позволяет привязать к упорядоченным спискам или векторам или словарям или картам. Используйте квадратные скобки "[]" символы для указания индексированного свойства. Содержимое этих квадратных скобок может быть целым числом (для упорядоченного списка) или неquoted строкой (для словарей). Вы также можете привязать к словарю, где ключ является целым числом. В одном пути можно использовать разные индексированные свойства с точкой, разделяющей свойство объекта.
Например, рассмотрим бизнес-объект, в котором есть список "Teams" (упорядоченный список), каждый из которых имеет словарь "Игроки", где каждый игрок имеет ключ по фамилии. Пример пути свойства к конкретному игроку во второй команде: "Teams[1]. Игроки[Смит]". (Вы используете 1, чтобы указать второй элемент в Teams, так как список равен нулевому индексу.)
Поддержка индексирования источников данных C++ ограничена; подробные сведения см. в разделе "Привязка данных".
Вложенные свойства
Пути к свойствам могут содержать ссылки на присоединенные свойства. Так как имя присоединенного свойства уже содержит точку, необходимо заключить любое присоединенное имя свойства в скобки, чтобы точка не рассматривалась как шаг свойства объекта. Например, строка, указывающая, что вы хотите использовать Canvas.ZIndex в качестве пути привязки: "(Canvas.ZIndex )". Дополнительные сведения о присоединенных свойствах см. в обзоре присоединенных свойств.
Объединение синтаксиса пути к свойству
В одной строке можно объединить различные элементы синтаксиса пути к свойству. Например, можно определить путь к свойству, ссылающийся на индексированное присоединенное свойство, если у источника данных было такое свойство.
Отладка пути свойства привязки
Так как путь к свойству интерпретируется подсистемой привязки и полагается на сведения, которые могут присутствовать только во время выполнения, необходимо часто отлаживать путь свойства для привязки, не имея возможности полагаться на обычную поддержку времени разработки или времени компиляции в средствах разработки. Во многих случаях результат выполнения, который не удалось устранить путь к свойству, является пустым значением без ошибки, так как это резервное поведение разрешения привязки путем разработки. К счастью, Microsoft Visual Studio предоставляет режим вывода отладки, который может изолировать часть пути свойства, указывающего источник привязки, не удалось разрешить. Дополнительные сведения об использовании этой функции средства разработки см . в разделе "Отладка" привязки данных подробно.
Путь к свойству для целевого объекта анимации
Анимации полагаются на свойство зависимостей, в котором раскадровные значения применяются при выполнении анимации. Чтобы определить объект, в котором есть анимированное свойство, анимация предназначена для элемента по имени (атрибут x:Name). Часто необходимо определить путь к свойству, который начинается с объекта, определяемого как Storyboard.TargetName, и заканчивается определенным значением свойства зависимостей, где должна применяться анимация. Этот путь свойства используется в качестве значения для Storyboard.TargetProperty.
Дополнительные сведения о том, как определить анимацию в XAML, см. в разделе "Раскадровки анимаций".
Простая целевая ориентация
Если вы анимируете свойство, существующее в самом целевом объекте, и тип этого свойства может применяться непосредственно к нему (а не к под свойству значения свойства), то можно просто назвать свойство, анимированное без дополнительной квалификации. Например, если вы нацелены на подкласс фигуры, например прямоугольник, и вы применяете анимированный цвет к свойству Fill, путь к свойству может быть "Fill".
Непрямое назначение свойств
Можно анимировать свойство, которое является вложенным свойством целевого объекта. Другими словами, если есть свойство целевого объекта, который сам объект, и этот объект имеет свойства, необходимо определить путь к свойству, объясняющий, как выполнить эту связь свойств. При указании объекта, в котором требуется анимировать под свойство, заключите имя свойства в скобки и укажите свойство в имени типа.формат propertyname . Например, чтобы указать, что требуется значение объекта свойства RenderTransform целевого объекта, укажите "(UIElement.RenderTransform)" в качестве первого шага в пути к свойству. Это еще не полный путь, так как анимации не могут применяться непосредственно к значению преобразования. Таким образом, в этом примере теперь вы завершите путь к свойству, чтобы конечное свойство было свойством подкласса Transform, которое может быть анимировано двойным значением: "(UIElement.RenderTransform).( CompositeTransform.TranslateX)"
Указание определенного дочернего элемента в коллекции
Чтобы указать дочерний элемент в свойстве коллекции, можно использовать числовый индексатор. Используйте квадратные скобки "[]" символы вокруг целочисленного значения индекса. Вы можете ссылаться только на упорядоченные списки, а не словари. Поскольку коллекция не является значением, которое может быть анимировано, использование индексатора никогда не может быть конечным свойством в пути к свойству.
Например, чтобы указать, что вы хотите анимировать первый цвет остановки цвета в LinearGradientBrush, который применяется к свойству фона элемента управления, это путь к свойству "(Control.Background).( GradientBrush.GradientStops)[0]. (GradientStop.Color)". Обратите внимание, что индексатор не является последним шагом пути, и что последний шаг особенно должен ссылаться на свойство GradientStop.Color элемента 0 в коллекции, чтобы применить к нему анимированное значение Color.
Анимация присоединенного свойства
Это не распространенный сценарий, но можно анимировать присоединенное свойство, если это присоединенное свойство имеет значение свойства, соответствующее типу анимации. Так как имя присоединенного свойства уже содержит точку, необходимо заключить любое присоединенное имя свойства в скобки, чтобы точка не рассматривалась как шаг свойства объекта. Например, строка, указывающая, что необходимо анимировать присоединенное свойство Grid.Row к объекту, используйте путь свойства "(Grid.Row )".
Примечание. В этом примере значение Grid.Row является типом свойства Int32. поэтому вы не можете анимировать его с помощью двойной анимации. Вместо этого вы определите объект ObjectAnimationUsingKeyFrames с компонентами DiscreteObjectKeyFrame, где ObjectKeyFrame.Value имеет целое число, например "0" или "1".
Правила для свойств в пути свойств анимации, предназначенных для целевого свойства
- Предполагаемая начальная точка пути свойства — это объект, определяемый раскадровкой.TargetName.
- Все объекты и свойства, на которые ссылается путь свойства, должны быть общедоступными.
- Конечное свойство (свойство, которое является последним именованным свойством в пути), должно быть общедоступным, быть чтением и записью и быть свойством зависимостей.
- Конечное свойство должно иметь тип свойства, который может быть анимирован одним из широких классов типов анимации (цветные анимации, двойные анимации, анимации точек, ObjectAnimationUsingKeyFrames).
Класс PropertyPath
Класс PropertyPath — это базовый тип свойства Binding.Path для сценария привязки.
Большую часть времени можно применить PropertyPath в XAML без использования кода вообще. Но в некоторых случаях может потребоваться определить объект PropertyPath с помощью кода и назначить его свойству во время выполнения.
PropertyPath имеет конструктор PropertyPath(String) и не имеет конструктора по умолчанию. Строка, передаваемая этому конструктору, представляет собой строку, определяемую с помощью синтаксиса пути свойства, как описано ранее. Это также та же строка, которую вы используете для назначения пути в качестве атрибута XAML. Единственным другим API класса PropertyPath является свойство Path , которое доступно только для чтения. Это свойство можно использовать в качестве строки построения для другого экземпляра PropertyPath .