2011-12-16 16 views
12

Tengo un elemento de imagen en XAML. Ato la propiedad Source a una propiedad de cadena en mi ViewModel. Sin embargo, a veces el valor es nulo y luego recibo errores en la ventana de depuración.Manejo de nulo cuando se vincula a una imagen en XAML

He leído aquí: ImageSourceConverter error for Source=null que podría hacer un convertidor para devolver DependencyProperty.UnsetValue si el valor es nulo.

Ahora me pregunto si es posible hacerlo directamente en XAML? ¿Quizás usando un FallbackValue? He intentado algunas variantes pero sin suerte.

Ésta es mi elemento de imagen en XAML:

<Image Name="img" Source="{Binding Path=CurrentImageSource}" Stretch="None" /> 

Y CurrentImageSource es sólo una propiedad de cadena en el DataContext.

El mensaje de error es: System.Windows.Data de error: 23:

Cannot convert '' from type '' to type 'System.Windows.Media.ImageSource' for 'sv-SE' culture with default conversions; consider using Converter property of Binding. NotSupportedException:'System.NotSupportedException: ImageSourceConverter cannot convert from (null).

Respuesta

16

Puede check for a null reference usando un activador de datos:

<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> 

Aunque no es posible comprobar directamente si dos valores difieren, puede ver si un valor es mayor o menor, etc. usando this approach Mike Hillberg blogged about.

+0

Gracias. Esperaba una sintaxis más simple (configuración de FallbackValue) pero supongo que no es posible. –

14

Yo no lo he probado, pero creo que esto es lo que TargetNullValue es para:

<Image Name="img" Source="{Binding Path=CurrentImageSource, TargetNullValue=/ImageNullRef;component/errorImage.png}" Stretch="None" /> 
+2

Bueno. Cortar y pegar no funcionó del todo. Necesitaba crear un recurso de imagen ('') y luego hacer referencia como ' '. Válida respuesta y aprendí algo -> +1 –

+0

Muy bueno. Me gusta esto. +1 – cplotts

41

Solía ​​x: Null con TargetNullValue, de esa manera se obtiene una imagen en blanco fácil ...

<Image Source="{Binding LogoPath, TargetNullValue={x:Null}}" /> 

De esta forma no necesita perder el tiempo con Triggers o BitmapImages como recursos estáticos.

0

Acabo de comprobar la respuesta de Sascha Hennig. Corre bien de mi lado. Acabo de tener una pequeña modificación de mi lado (eliminar /ImageNullRef; en el recurso de imagen) <BitmapImage x:Key='defaultImage' UriSource='component/errorImage.png' />

Cuestiones relacionadas