Обработка null при привязке к изображению в XAML
У меня есть элемент Image в XAML. Я привязываю свойство Source к свойству string в моей модели ViewModel. Однако иногда значение равно null, а затем я получаю ошибки в окне отладки.
Я читаю здесь: Ошибка ImageSourceConverter для Source = null, что я мог бы заставить конвертер возвращать DependencyProperty.UnsetValue, если значение равно null.
Теперь мне интересно, можно ли сделать это прямо в XAML? Возможно, используя FallbackValue?
Я попробовал несколько вариантов, но не повезло.
Это мой элемент изображения в XAML:
<Image Name="img" Source="{Binding Path=CurrentImageSource}" Stretch="None" />
И CurrentImageSource - это просто свойство строки в DataContext.
Сообщение об ошибке:
Ошибка System.Windows.Data: 23:
Невозможно преобразовать '' из типа '' в тип 'System.Windows.Media.ImageSource' для культуры 'sv-SE' с настройками по умолчанию преобразования; рассмотрим использование свойства преобразования Binding. NotSupportedException: 'System.NotSupportedException: ImageSourceConverter не может преобразовать из (null).
Ответы
Ответ 1
Вы можете проверить нулевую ссылку с помощью триггера данных:
<Image Name="img" Stretch="None" >
<Image.Style>
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="{Binding CurrentImageSource}" />
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentImageSource}" Value="{x:Null}">
<Setter Property="Source" Value="/ImageNullRef;component/errorImage.png" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
Пока невозможно напрямую проверить, отличаются ли два значения, вы можете увидеть, больше или меньше значение и т.д., используя этот подход Майк Хиллберг, блогг о.
Ответ 2
Я использовал x: Null с TargetNullValue, таким образом вы получите легкое пустое изображение...
<Image Source="{Binding LogoPath, TargetNullValue={x:Null}}" />
Таким образом, вам не нужно возиться с триггерами или битмапами в качестве статических ресурсов.
Ответ 3
Я не тестировал его, но я думаю, что это TargetNullValue для:
<Image Name="img" Source="{Binding Path=CurrentImageSource, TargetNullValue=/ImageNullRef;component/errorImage.png}" Stretch="None" />
Ответ 4
Я просто проверяю ответ Саши Хеннига. Это хорошо работает на моей стороне. У меня просто небольшая модификация на моей стороне (удалите /ImageNullRef;
в ресурсе изображения)
<BitmapImage x:Key='defaultImage' UriSource='component/errorImage.png' />