Обработка нуля при привязке к изображению в XAML - PullRequest
17 голосов
/ 16 декабря 2011

У меня есть элемент Image в XAML.Я привязываю свойство Source к строковому свойству в моей ViewModel.Однако иногда это значение равно нулю, а затем я получаю ошибки в окне отладки.

Я прочитал здесь: Ошибка ImageSourceConverter для Source = null , что я мог бы сделать конвертер для возврата DependencyProperty.UnsetValueесли значение равно нулю.

Теперь мне интересно, возможно ли это сделать напрямую в XAML?Возможно, используя FallbackValue?Я пробовал несколько вариантов, но безуспешно.

Это мой элемент Image в XAML:

<Image Name="img" Source="{Binding Path=CurrentImageSource}" Stretch="None" />

А CurrentImageSource - просто строковое свойство в DataContext.

Сообщение об ошибке: System.Windows.Data Error: 23:

Невозможно преобразовать '' из типа '' в тип 'System.Windows.Media.ImageSource' для культуры 'sv-SE' сконверсии по умолчанию;рассмотрите возможность использования свойства Converter Binding.NotSupportedException: 'System.NotSupportedException: ImageSourceConverter не может преобразовать из (ноль).

Ответы [ 4 ]

53 голосов
/ 14 февраля 2014

Я использовал x: Null с TargetNullValue, чтобы вы могли легко получить чистое изображение ...

<Image Source="{Binding LogoPath, TargetNullValue={x:Null}}" />

Таким образом, вам не нужно возиться с триггерами или BitmapImages в качестве статических ресурсов.

18 голосов
/ 16 декабря 2011

Вы можете проверить нулевую ссылку , используя триггер данных:

<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>

Хотя невозможно напрямую проверить, отличаются ли два значения, вы можете увидеть, является ли значение большим или меньшим и т. Д., Используя , этот подход Майк Хиллберг написал в блоге о .

16 голосов
/ 17 декабря 2011

Я не проверял это, но я думаю, что это то, для чего предназначен TargetNullValue:

<Image Name="img" Source="{Binding Path=CurrentImageSource, TargetNullValue=/ImageNullRef;component/errorImage.png}" Stretch="None" />
0 голосов
/ 30 июня 2017

Я просто проверяю ответ Саша Хенниг.Это хорошо работает на моей стороне.У меня есть небольшая модификация на моей стороне (удалите /ImageNullRef; в ресурсе изображения) <BitmapImage x:Key='defaultImage' UriSource='component/errorImage.png' />

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...