Как WPF обрабатывает привязку к свойству нулевого объекта?
У меня есть listBox, используя itemTemplate, который содержит следующую строку:
<Image Source="{Binding MyProperty.PossiblyNullObject.UrlProperty}"/>
Связанный с этим listBox представляет собой коллекцию представлений моделей, которая загружает компоненты элементов в коллекции в отдельном потоке. "Вероятно, NullObject" не может быть установлен в значение, когда код xaml сначала отображается механизмом компоновки.
Как WPF справляется с этим? Использует ли оно значение по умолчанию (без источника изображения, а не изображение) и продолжает? Подождите? Он автоматически обнаруживает, когда значение инициализируется и переизлучается с новым источником? Как это не исключает исключения объекта null так же, как если бы я программным способом называл "MyProperty.PossiblyNullObject.UrlProperty"? Как я могу воспроизвести эту функцию в своем собственном коде, когда я попытаюсь назвать ее?
Спасибо за любые предложения. Я смущающе новичок в WPF, и я пытаюсь решить проблему из своей глубины. Загрузка изображения является перфомансой, поэтому я нашел решение для загрузки, декодирования, а затем заморозить источник изображения в фоновом потоке, чтобы он не блокировал пользовательский интерфейс. К сожалению, я столкнулся с этой проблемой с нулевым исключением, когда попытался заменить привязку источника изображения на мое решение, которое вызывает одно и то же свойство. WPF каким-то образом обрабатывает возможные нулевые объекты, и я хотел бы сделать это так же, как держать вещи в чистоте.
Ответы
Ответ 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