Ошибка ImageSourceConverter для источника=null

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

2 ответов


@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) также избавится от исключений, но все еще есть хит производительности (и это не обязательно).

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

In ресурсы:

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

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

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

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