Резервные значения привязки в Xamarin.Forms
Иногда может происходить сбой привязки данных из-за того, что не удалось разрешить источник привязки, или из-за того, что успешно выполненная привязка возвращает значение null
. Хотя в таких ситуациях можно применять преобразователи величин или другой дополнительный код, повысить надежность привязок можно путем определения резервных значений, которые используются в случае сбоя привязки. Для этого можно определить свойства FallbackValue
и TargetNullValue
в выражении привязки. Так как эти свойства находятся в классе BindingBase
, их можно использовать с обычными привязками, множественными привязками, скомпилированными привязками и расширением разметки Binding
.
Примечание.
Использование свойств FallbackValue
и TargetNullValue
в выражении привязки не является обязательным.
Определение резервного значения
Свойство FallbackValue
позволяет определить резервное значение, которое будет использоваться, если невозможно разрешить источник привязки. Это свойство задается, например, при привязке к исходным свойствам, которые могут иметься не у всех объектов однородных типов в связанной коллекции.
На странице MonkeyDetail иллюстрируется задание свойства FallbackValue
:
<Label Text="{Binding Population, FallbackValue='Population size unknown'}"
... />
Для привязки к Label
определено значение FallbackValue
, которое будет присвоено целевому объекту, если не удастся разрешить источник привязки. Поэтому, если у привязанного объекта нет свойства Population
, отображается значение, определенное в свойстве FallbackValue
. Обратите внимание на то, что здесь значение свойства FallbackValue
отделяется одинарными кавычками (апострофами).
Значения свойств FallbackValue
рекомендуется определять не в коде, а в качестве ресурсов а ResourceDictionary
. Преимущество такого подхода состоит в том, что такие значения определяются однократно в одном месте, где их легко найти. Ресурсы можно извлечь с помощью расширения разметки StaticResource
:
<Label Text="{Binding Population, FallbackValue={StaticResource populationUnknown}}"
... />
Примечание.
Свойство FallbackValue
невозможно задать с помощью выражения привязки.
Вот работающая программа:
Если свойство FallbackValue
не задано в выражении привязки и не удалось разрешить путь привязки или его часть, для целевого объекта задается BindableProperty.DefaultValue
. Однако если свойство FallbackValue
задано, но не удается разрешить путь привязки или его часть, для целевого объекта задается значение свойства FallbackValue
. Поэтому на странице MonkeyDetail в элементе Label
отображается текст "Population size unknown" (Размер популяции неизвестен), так как у привязанного объекта нет свойства Population
.
Внимание
Если задано свойство FallbackValue
, определенный преобразователь величин не выполняется в выражении привязки.
Определение значения, заменяющего NULL
Свойство TargetNullValue
позволяет определить заменяющее значение, которое будет использоваться, если источник привязки разрешается, но возвращается значение null
. Это свойство задается, например, при привязке к исходным свойствам, которые могут иметь значение null
в связанной коллекции.
На странице Monkeys иллюстрируется задание свойства TargetNullValue
:
<ListView ItemsSource="{Binding Monkeys}"
...>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
...
<Image Source="{Binding ImageUrl, TargetNullValue='https://upload.wikimedia.org/wikipedia/commons/2/20/Point_d_interrogation.jpg'}"
... />
...
<Label Text="{Binding Location, TargetNullValue='Location unknown'}"
... />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Для привязок к Image
и Label
определены значения TargetNullValue
, которые применяются, если путь привязки возвращает значение null
. Поэтому значения свойств TargetNullValue
отображаются для всех объектов в коллекции, для которых свойства ImageUrl
и Location
не определены. Обратите внимание на то, что здесь значения свойства TargetNullValue
отделяются одинарными кавычками (апострофами).
Значения свойств TargetNullValue
рекомендуется определять не в коде, а в качестве ресурсов а ResourceDictionary
. Преимущество такого подхода состоит в том, что такие значения определяются однократно в одном месте, где их легко найти. Ресурсы можно извлечь с помощью расширения разметки StaticResource
:
<Image Source="{Binding ImageUrl, TargetNullValue={StaticResource fallbackImageUrl}}"
... />
<Label Text="{Binding Location, TargetNullValue={StaticResource locationUnknown}}"
... />
Примечание.
Свойство TargetNullValue
невозможно задать с помощью выражения привязки.
Вот работающая программа:
Когда свойство TargetNullValue
не указано в выражении привязки, исходное значение null
преобразуется, если определен преобразователь величин, форматируется, если определен формат StringFormat
, а затем результат задается для целевого объекта. Однако когда свойство TargetNullValue
указано, исходное значение null
преобразуется, если определен преобразователь величин, а затем, если оно по-прежнему равно null
после преобразования, значение свойства TargetNullValue
задается для целевого объекта.
Внимание
Если свойство TargetNullValue
задано, форматирование строк в выражении привязки не применяется.