59 votes

Erreur ImageSourceConverter pour Source = null

Je suis de liaison de la propriété Source d'une Image à une chaîne. Cette chaîne peut être null dans ce cas, je ne veux pas afficher une Image. Cependant, j'ai la suite dans ma sortie de Débogage:

Système.De Windows.Erreur De Données: 23 : Impossible De convertir '<null>' de type '<null>' pour type 'Système.De Windows.Médias.ImageSource " pour "en-UA' la culture par défaut les conversions; envisager d'utiliser un Convertisseur propriété de la Liaison. NotSupportedException:'Système.NotSupportedException: ImageSourceConverter ne peut pas convertir à partir de (null). au Système.ComponentModel.TypeConverter.GetConvertFromException(Objet valeur), à Système.De Windows.Médias.ImageSourceConverter.ConvertFrom(ITypeDescriptorContext contexte, CultureInfo culture, Objet valeur), à MME Internes.Les données.DefaultValueConverter.ConvertHelper(Objet o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)'

Je préfère, si ce n'était pas affichée que c'est juste le bruit est-il possible de le supprimer?

102voto

Pat Points 4681

@AresAvatar est juste en suggérant vous utilisez un ValueConverter, mais que la mise en œuvre n'aide pas la situation. Ce n':

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)
    {
        throw new NotImplementedException();
    }
}

De retour DependencyProperty.UnsetValue aborde également les problèmes de performances de lancer (et en ignorant) toutes ces exceptions. Retour d'un new BitmapSource(uri) permettrait également de se débarrasser des exceptions, mais il y a toujours un gain de performance (et il n'est pas nécessaire).

Bien sûr, vous aurez également besoin de la plomberie:

Ressources:

<local:NullImageConverter x:Key="nullImageConverter"/>

Votre image:

<Image Source="{Binding Path=ImagePath, Converter={StaticResource nullImageConverter}}"/>

6voto

scrat789 Points 813

Liez votre image directement sur un objet et retournez "UnsetValue" si nécessaire

 <Image x:Name="Logo" Source="{Binding ImagePath}"  />
 

La propriété dans votre 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");
        }
    }
 

1voto

Ed Bayiates Points 6517

Utilisez un convertisseur de valeurs:

En ressources:

 >local:IconPathConverter x:Key="iconPathConverter" />
 

Votre image:

 <Image Source="{Binding Path=ImagePath, Converter={StaticResource iconPathConverter}}" />
 

Le convertisseur:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X