Source = null的ImageSourceConverter错误

我将图像的Source属性绑定到一个string。 这个string可能是null,在这种情况下,我只是不想显示一个图像。 但是,我在我的debugging输出中得到以下内容:

System.Windows.Data错误:23:无法将types'<null>'中的'<null>'转换为具有默认转换的'en-AU'文化types'System.Windows.Media.ImageSource'; 考虑使用Binding的Converter属性。 NotSupportedException:'System.NotSupportedException:ImageSourceConverter不能从(null)转换。 System.ComponentModel.TypeConverter.GetConvertFromException(Object value)at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o,Type destinationType,DependencyObject)上System.Windows.Media.ImageSourceConverter.ConvertFrom(ITypeDescriptorContext上下文,CultureInfo文化,对象值) targetElement,CultureInfo culture,布尔isForward)'

我宁愿如果这不显示,因为它只是噪音 – 有没有办法压制它?

@AresAvatar正确地build议你使用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还解决抛出(和忽略)所有这些exception的性能问题。 返回一个new BitmapSource(uri)也将消除这个exception,但是仍然会有性能下降(这是不必要的)。

当然,你也需要pipe道:

在资源方面:

 <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"); } } 

使用值转换器:

在资源方面:

 >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(); } }