我在XAML中有一个Image元素。我将Source属性绑定到ViewModel中的字符串属性。但是,有时值为null,然后我在调试窗口中出现错误。
我在这里阅读:ImageSourceConverter error for Source=null如果值为null,我可以使转换器返回DependencyProperty.UnsetValue。
现在我想知道是否可以直接在XAML中进行此操作?也许通过使用FallbackValue? 我尝试了一些变种,但没有运气。
这是我在XAML中的Image元素:
<Image Name="img" Source="{Binding Path=CurrentImageSource}" Stretch="None" />
而CurrentImageSource只是DataContext上的一个字符串属性。
错误消息是: System.Windows.Data错误:23:
无法将''从类型''转换为类型 默认情况下'sv-SE'文化的'System.Windows.Media.ImageSource' 转换;考虑使用Binding的Converter属性。 NotSupportedException异常:的“System.NotSupportedException: ImageSourceConverter无法转换为(null)。
答案 0 :(得分:51)
我使用x:Null和TargetNullValue,这样你就可以得到一个简单的空白图像......
<Image Source="{Binding LogoPath, TargetNullValue={x:Null}}" />
这样您就不需要将Triggers或BitmapImages作为静态资源使用。
答案 1 :(得分:18)
您可以check for a null reference使用数据触发器:
<Image Name="img" Stretch="None" >
<Image.Style>
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="{Binding CurrentImageSource}" />
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentImageSource}" Value="{x:Null}">
<Setter Property="Source" Value="/ImageNullRef;component/errorImage.png" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
虽然无法直接测试两个值是否不同,但您可以使用this approach Mike Hillberg blogged about查看值是更大还是更小等。
答案 2 :(得分:16)
我还没有测试过,但我认为这就是TargetNullValue的用途:
<Image Name="img" Source="{Binding Path=CurrentImageSource, TargetNullValue=/ImageNullRef;component/errorImage.png}" Stretch="None" />
答案 3 :(得分:0)
我只是检查一下Sascha Hennig的答案。它在我身边运行良好。我只是稍微修改了一下(在图片资源中删除/ImageNullRef;
)
<BitmapImage x:Key='defaultImage' UriSource='component/errorImage.png' />