Подтвердить что ты не робот

Обработка 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).

4b9b3361

Ответ 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' />