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

Ошибка ImageSourceConverter для Source = null

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

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

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

4b9b3361

Ответ 1

@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}}"/>

Ответ 2

Привяжите свое изображение непосредственно к объекту и при необходимости верните "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");
        }
    }

Ответ 3

Используйте конвертер значений:

В ресурсах:

>local:IconPathConverter x:Key="iconPathConverter" />

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

<Image Source="{Binding Path=ImagePath, Converter={StaticResource iconPathConverter}}" />

Конвертер:

/// <summary>
/// Prevents a null IconPath from being a problem
/// </summary>
public class IconPathConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || value is string && ((string)value).Length == 0)
            return (ImageSource)null;
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}