Синтаксис PropertyPath XAML
PropertyPath Поддерживает сложный встроенный объект XAML синтаксиса для настройки различных свойств, которые принимают PropertyPath тип в качестве значения. Этом разделе описана PropertyPath синтаксис применительно к привязки и анимации.
Где используется PropertyPath
PropertyPath представляет собой общий объект, который используется в нескольких Windows Presentation Foundation (WPF) функции. Несмотря на использование общего PropertyPath для передачи информации о пути к свойству, варианты использования для каждой области возможностей где PropertyPath используется как тип варьироваться. Таким образом, более практично документировать синтаксис для каждой функции.
В основном WPF использует PropertyPath для описания путей объектной модели для нахождения свойств источника данных и для описания конечного пути для целевой анимации.
Некоторые свойства стиля и шаблона, такие как Setter.Property принимают имя полное свойство, которое внешне напоминает PropertyPath. Но это не подлинный PropertyPath; вместо этого это owner.property строка для использования формата обеспечивается WPF XAML процессора в сочетании с преобразователем типов для DependencyProperty.
PropertyPath для объектов в привязке данных
Привязка данных является функцией WPF, которую можно привязать к целевому значению любого свойства зависимостей. Однако источник такой привязки данных не обязательно должен быть свойством зависимостей. Это может быть любой тип свойства, распознаваемый применимым поставщиком данных. Пути свойств используются особенно для ObjectDataProvider, который используется для получения источников привязки из CLR объектов и их свойств.
Обратите внимание, что привязка данных к XML не использует PropertyPath, так как он не использует Path в Binding. Вместо этого использовать XPath и укажите допустимый синтаксис XPath в Модель объектов XML-документов (DOM) данных. XPath также указываются в виде строки, но не документируется здесь. см. в разделе привязка к данным XML с помощью XMLDataProvider и запросов XPath.
Ключом к пониманию путей к свойствам в привязке к данным является то, что можно настроить целевой объект привязки на отдельное значение свойства либо использовать привязку к целевым свойствам, которые принимают списки или коллекции. При связывании коллекций, например привязки ListBox , будет расширяться в зависимости от количества элементов данных в коллекции, а затем путь к свойству должен ссылаться на объект коллекции, а не отдельные элементы коллекции. Механизм привязки данных будет соответствовать коллекции, используемой как источник данных в тип целевого объекта привязки автоматически, что приводит к заполнению ListBox массивом элементов.
Одиночное свойство в объекте интерпретации в качестве контекста данных
<Binding Path="propertyName" .../>
propertyName должно разрешаться как имя свойства, которое находится в текущем DataContext для Path использования. Если привязка обновляет источник, это свойство должно быть доступно для чтения и записи, а исходный объект должен быть изменяемым.
Одиночный индексатор в объекте интерпретации в контексте данных
<Binding Path="[key]" .../>
key
должен быть либо типизированным индексом для словаря или хэш-таблицу или целочисленный индекс массива. Кроме того, значение ключа должно быть типом, который можно непосредственно привязать к свойству, в котором оно применяется. Например, хэш-таблицу, содержащий строковых ключей и строковых значений можно использовать таким образом для привязки к тексту для TextBox. Либо, если ключ указывает на коллекцию или субиндекс, этот синтаксис можно использовать для привязки к целевому свойству коллекции. В противном случае необходимо ссылаться на конкретное свойство, например с помощью синтаксиса <Binding Path="[key].propertyName" .../>
.
При необходимости можно указать тип индекса. Дополнительные сведения об этом аспекте индексированного пути свойства, см. в разделе Binding.Path.
Несколько свойств (косвенное назначение свойства)
<Binding Path="propertyName.propertyName2" .../>
propertyName
должно разрешаться как имя свойства, которое является текущим DataContext. Свойствами пути propertyName
и propertyName2
могут быть любые свойства, которые существуют в связи, где propertyName2
— свойство, которое существует в типе, являющемся значением propertyName
.
Одиночное свойство, присоединенное свойство или свойство с указанием типа
<object property="(ownerType.propertyName)" .../>
Скобки означают, что это свойство в PropertyPath должно быть создано с использованием частичной квалификации. Может использоваться пространство имен XML для поиска типа с соответствующим сопоставлением. ownerType
Выполняет поиск типов, XAML обработчик имеет доступ к, до XmlnsDefinitionAttribute объявления в каждой сборке. В большинстве приложений есть пространство имен XML по умолчанию, сопоставленное пространству имен http://schemas.microsoft.com/winfx/2006/xaml/presentation, поэтому префикс обычно требуется только для настраиваемых типов или типов вне этого пространства имен. propertyName
должно разрешаться как имя свойства, существующего в ownerType
. Этот синтаксис обычно используется в одном из следующих случаев.
Путь, указанный в XAML, который находится в стиле или шаблоне, не имеющем указанного целевого типа. Использование полных имен обычно недействительно для иных случаев, поскольку в отличие от стилей и шаблонов свойство существует в экземпляре, а не в типе.
Свойство является присоединенным свойством.
Выполняется привязка к статическому свойству.
Для использования в качестве цели раскадровки свойство, указанное как propertyName
должно быть DependencyProperty.
Обход источников (привязка к иерархиям коллекций)
<object Path="propertyName/propertyNameX" .../>
/ в этом синтаксисе используется для навигации в иерархическом объекте источника данных. Поддерживается несколько шагов в иерархии с последовательными символами /. Обход источников учитывает текущую позицию указателя записи, которая определяется синхронизацией данных с пользовательским интерфейсом его представления. Дополнительные сведения о привязке к иерархическим объектам источника данных и концепции указателя текущей записи в привязке данных см. в разделе Использование шаблона "Основной/подробности" с иерархическими данными или Общие сведения о привязке данных.
Note
Внешне этот синтаксис походит на XPath. Настоящую XPath выражение для привязки к XML источник данных не используется в качестве Path значение и вместо этого следует использовать для взаимоисключающего XPath свойство.
Представления коллекций
Для ссылки на представление именованной коллекции перед именем представления используется символ решетки (#
).
Указатель текущей записи
Чтобы ссылаться на указатель текущей записи для представления коллекции или сценария привязки данных "Основной/подробности", в начале строки пути поставьте косую черту (/
). Обход любого пути, проходящего через косую черту, начинается с указателя текущей записи.
Несколько индексаторов
<object Path="[index1,index2...]" .../>
or
<object Path="propertyName[index,index2...]" .../>
Если данный объект поддерживает несколько индексаторов, их можно указать по порядку, аналогично синтаксису ссылок на массив. Рассматриваемый объект может быть либо текущим контекстом, либо значением свойства, содержащего объект с несколькими индексами.
По умолчанию значения индексатора вводятся с использованием характеристик базового объекта. При необходимости можно указать тип индекса. Дополнительные сведения о вводе индексаторов см. в разделе Binding.Path.
Смешанные синтаксисы
Можно смешивать все синтаксисы, показанные выше. Например, ниже приведен пример, в котором создается путь к свойству цвета в определенных координатах x, y ColorGrid
свойства, содержащего массив сетки пикселей SolidColorBrush объектов:
<Rectangle Fill="{Binding ColorGrid[20,30].SolidColorBrushResult}" .../>
Escape-символы для строк путей к свойствам
Для некоторых бизнес-объектов может возникнуть случай, когда для правильного анализа строки пути к свойству требуется escape-последовательность. Такая необходимость должна возникать редко, так как многие из этих символов имеют аналогичные проблемы взаимодействия при именовании в языках, которые обычно используются для определения бизнес-объекта.
Внутри индексаторов ([ ]) символ каретки (^) служит escape-символом для следующего символа.
Необходимо предварять escape-символами (используя XML-сущности) определенные символы, которые являются специальными для определения языка XML. Используйте
&
в качестве escape-символа для символа &. Используйте>
в качестве escape-символа для символа >.Необходимо предварять escape-символами (с помощью обратной косой черты
\
) символы, которые являются специальными для поведения средства синтаксического анализа WPF XAML для обработки расширения разметки.Обратная косая черта (
\
) сама по себе является escape-символом.Знак равенства (
=
) разделяет имя и значение свойства.Запятая (
,
) разделяет свойства.Закрывающая фигурная скобка (
}
) — это конец расширения разметки.
Note
С технической точки зрения, эти escape-последовательности также работают для пути к свойству раскадровки, но обычно объектные модели обходятся для существующих объектов WPF и использование escape-символов не требуется.
PropertyPath для целевых объектов анимации
Целевое свойство анимации должно быть свойством зависимостей, который принимает либо 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 объявления в каждой сборке. В большинстве приложений есть пространство имен XML по умолчанию, сопоставленное пространству имен http://schemas.microsoft.com/winfx/2006/xaml/presentation, поэтому префикс обычно требуется только для настраиваемых типов или типов вне этого пространства имен. 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[]) для сложной анимации. Последний конструктор использует строку токена для первого параметра и массив объектов, которые заполняют позиции в строке токена, чтобы определить отношение пути к свойству.