Ошибка ImageSourceConverter для Source = null - PullRequest
45 голосов
/ 23 марта 2011

Я связываю свойство Source изображения со строкой. Эта строка может быть нулевой, в этом случае я просто не хочу отображать изображение. Однако в выводе отладки я получаю следующее:

System.Windows.Data Ошибка: 23: невозможно преобразовать '' из типа '' в тип 'System.Windows.Media.ImageSource' для 'en-AU' культура по умолчанию преобразования; рассмотреть возможность использования конвертера Свойство Binding. NotSupportedException: 'System.NotSupportedException: ImageSourceConverter не может конвертировать от (ноль). в System.ComponentModel.TypeConverter.GetConvertFromException (Объект значение) в System.Windows.Media.ImageSourceConverter.ConvertFrom (ITypeDescriptorContext контекст, КультураИнфо культура, Объект значение) в MS.Internal.Data.DefaultValueConverter.ConvertHelper (Объект o, введите destinationType, DependencyObject targetElement, КультураИнфо, Булевская культура isForward) '

Я бы предпочел, чтобы это не отображалось, так как это просто шум - есть ли способ подавить его?

Ответы [ 3 ]

86 голосов
/ 12 апреля 2011

@ AresAvatar прав, предлагая вам использовать ValueConverter, но эта реализация не помогает ситуации.Это делает:

public class NullImageConverter :IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return DependencyProperty.UnsetValue;
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // According to https://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.convertback(v=vs.110).aspx#Anchor_1
        // (kudos Scott Chamberlain), if you do not support a conversion 
        // back you should return a Binding.DoNothing or a 
        // DependencyProperty.UnsetValue
        return Binding.DoNothing;
        // Original code:
        // throw new NotImplementedException();
    }
}

Возвращение DependencyProperty.UnsetValue также решает проблемы производительности из-за выброса (и игнорирования) всех этих исключений.Возвращение new BitmapSource(uri) также избавит от исключений, но производительность все равно будет падать (и в этом нет необходимости).

Конечно, вам также понадобится сантехника:

В ресурсах:

<local:NullImageConverter x:Key="nullImageConverter"/>

Ваше изображение:

<Image Source="{Binding Path=ImagePath, Converter={StaticResource nullImageConverter}}"/>
4 голосов
/ 10 сентября 2013

Свяжите свое изображение непосредственно с объектом и при необходимости верните "UnsetValue"

<Image x:Name="Logo" Source="{Binding ImagePath}"  />

Свойство в вашей ViewModel:

    private string _imagePath = string.Empty;
    public object ImagePath 
    {
        get
        {
            if (string.IsNullOrEmpty(_imagePath))
                return DependencyProperty.UnsetValue;

            return _imagePath;
        }
        set
        {
            if (!(value is string)) 
                return;

            _imagePath = value.ToString();
            OnPropertyChanged("ImagePath");
        }
    }
1 голос
/ 27 ноября 2018

Я использовал технику Пата ValueConverter, и она отлично работала.Я также попробовал метод TargetNullValue с помощью flobodob из здесь , и он также отлично работает.

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

TargetNullValue проще и не требует конвертера.

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