115 votes

Définir une valeur à null dans la liaison WPF

Veuillez jeter un coup d'œil à la ligne suivante

<TextBox Text="{Binding Price}"/>

Cette propriété de prix ci-dessus est un Decimal? (décimale annulable).

Je veux que si l'utilisateur supprime le contenu de la zone de texte (c'est-à-dire qu'il entre une chaîne vide), la source de données (la cible de la liaison) soit automatiquement mise à jour avec null (Nothing en VB).

Une idée sur la façon de le faire en XAML ?

224voto

Shimmy Points 23393

J'utilise .NET 3.5 SP1, c'est donc très simple :

<TextBox Text="{Binding Price, TargetNullValue=''}"/>

Ce qui signifie (merci Gregor pour votre commentaire) :

<TextBox Text="{Binding Price, TargetNullValue={x:Static sys:String.Empty}}"/>

sys est l'espace de noms xml importé pour System en mscorlib :

xmlns:sys="clr-namespace:System;assembly=mscorlib"

J'espère que cela vous a aidé.

12voto

Thomas Levesque Points 141081

Ce convertisseur de valeur devrait faire l'affaire :

public class StringToNullableDecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
        CultureInfo culture)
    {
        decimal? d = (decimal?)value;
        if (d.HasValue)
            return d.Value.ToString(culture);
        else
            return String.Empty;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        string s = (string)value;
        if (String.IsNullOrEmpty(s))
            return null;
        else
            return (decimal?)decimal.Parse(s, culture);
    }
}

Déclarez une instance de ce convertisseur dans le fichier ressources :

<Window.Resources>
    <local:StringToNullableDecimalConverter x:Key="nullDecimalConv"/>
</Window.Resources>

Et utilisez-le dans votre reliure :

<TextBox Text="{Binding Price, Converter={StaticResource nullDecimalConv}}"/>

Il convient de noter que TargetNullValue n'est pas approprié ici : il est utilisé pour définir quelle valeur doit être utilisée lorsque l'option source de la liaison est nulle. En l'occurrence, il s'agit d'une Price n'est pas la source, c'est une propriété de la source...

5voto

TimothyP Points 6043

Vous pouvez essayer d'utiliser un convertisseur de valeur (IValueConverter) http://msdn.microsoft.com/en-us/library/system.Windows.data.ivalueconverter.aspx

De l'arrière de ma tête ici, quelque chose comme :

public class DoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        return (double)value;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
    var doubleValue = Convert.ToDouble(value);

    return (doubleValue == 0 ? null : doubleValue);
    }
}

(Il pourrait cependant être nécessaire d'y apporter quelques modifications)

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