绑定到XAML中的Image时处理null

时间:2011-12-16 07:13:22

标签: wpf binding

我在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)。

4 个答案:

答案 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' />