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