Резервные значения привязки в 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

Если свойство 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

Когда свойство TargetNullValue не указано в выражении привязки, исходное значение null преобразуется, если определен преобразователь величин, форматируется, если определен формат StringFormat, а затем результат задается для целевого объекта. Однако когда свойство TargetNullValue указано, исходное значение null преобразуется, если определен преобразователь величин, а затем, если оно по-прежнему равно null после преобразования, значение свойства TargetNullValue задается для целевого объекта.

Внимание

Если свойство TargetNullValue задано, форматирование строк в выражении привязки не применяется.