ImageSourceConverter error for Source=null
@AresAvatar is right in suggesting you use a ValueConverter, but that implementation does not help the situation. This does:
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(); }}
Returning DependencyProperty.UnsetValue
also addresses the performance issues from throwing (and ignoring) all those exceptions. Returning a new BitmapSource(uri)
would also get rid of the exceptions, but there is still a performance hit (and it isn't necessary).
Of course, you'll also need the plumbing:
In resources:
<local:NullImageConverter x:Key="nullImageConverter"/>
Your image:
<Image Source="{Binding Path=ImagePath, Converter={StaticResource nullImageConverter}}"/>
I used Pat's ValueConverter technique and it worked great.I also tried the TargetNullValue technique, by flobodob from here, and it also works great. It's easier and cleaner.
<Image Source="{Binding LogoPath, TargetNullValue={x:Null}}" />
TargetNullValue is simpler, and requires no converter.
Bind your image directly on an object and return "UnsetValue" if necessary
<Image x:Name="Logo" Source="{Binding ImagePath}" />
The property in your 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"); } }