Как WPF обрабатывает привязку к свойству нулевого объекта? - программирование
Подтвердить что ты не робот

Как WPF обрабатывает привязку к свойству нулевого объекта?

У меня есть listBox, используя itemTemplate, который содержит следующую строку:

<Image Source="{Binding MyProperty.PossiblyNullObject.UrlProperty}"/> 

Связанный с этим listBox представляет собой коллекцию представлений моделей, которая загружает компоненты элементов в коллекции в отдельном потоке. "Вероятно, NullObject" не может быть установлен в значение, когда код xaml сначала отображается механизмом компоновки.

Как WPF справляется с этим? Использует ли оно значение по умолчанию (без источника изображения, а не изображение) и продолжает? Подождите? Он автоматически обнаруживает, когда значение инициализируется и переизлучается с новым источником? Как это не исключает исключения объекта null так же, как если бы я программным способом называл "MyProperty.PossiblyNullObject.UrlProperty"? Как я могу воспроизвести эту функцию в своем собственном коде, когда я попытаюсь назвать ее?

Спасибо за любые предложения. Я смущающе новичок в WPF, и я пытаюсь решить проблему из своей глубины. Загрузка изображения является перфомансой, поэтому я нашел решение для загрузки, декодирования, а затем заморозить источник изображения в фоновом потоке, чтобы он не блокировал пользовательский интерфейс. К сожалению, я столкнулся с этой проблемой с нулевым исключением, когда попытался заменить привязку источника изображения на мое решение, которое вызывает одно и то же свойство. WPF каким-то образом обрабатывает возможные нулевые объекты, и я хотел бы сделать это так же, как держать вещи в чистоте.

4b9b3361

Ответ 1

В BindingBase есть два свойства: TargetNullValue и FallbackValue.

TargetNullValue возвращает ваше значение, когда значение источника равно null.

FallbackValue возвращает ваше значение, когда привязка не может вернуть значение.

Пример использования:

<!-- xmlns:sys="clr-namespace:System;assembly=mscorlib" -->

<Window.Resources>
    <!-- Test data -->
    <local:TestDataForImage x:Key="MyTestData" />

    <!-- Image for FallbackValue -->
    <sys:String x:Key="ErrorImage">pack://application:,,,/NotFound.png</sys:String>

    <!-- Image for NULL value -->
    <sys:String x:Key="NullImage">pack://application:,,,/NullImage.png</sys:String>
</Window.Resources>

<Grid DataContext="{StaticResource MyTestData}">
    <Image Name="ImageNull"
           Width="100" 
           Height="100"
           Source="{Binding Path=NullString, TargetNullValue={StaticResource NullImage}}" />

    <Image Name="ImageNotFound"
           Width="100" 
           Height="100" 
           Source="{Binding Path=NotFoundString, FallbackValue={StaticResource ErrorImage}}" />
</Grid>

См. ссылки для получения дополнительной информации:

Свойство BindingBase.TargetNullValue

Свойство BindingBase.FallbackValue