IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Afficher des double en XAML avec des converter


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Médecin
    Inscrit en
    Mai 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2019
    Messages : 8
    Par défaut Afficher des double en XAML avec des converter
    Salut,

    Je bloque sur un morceau de code pour ma liaison de données. J'ai un ViewModel fait de propriétés de type Nullable<double>. Dans mon formulaire XAML, j'utilise donc un converter pour assurer la conversion et prendre en charge une valeur vide. Jusqu'ici, pas de problème. Mais je suis totalement incapable d'utiliser des décimales, car elles sont automatiquement supprimées. C'est-à-dire que quand j'écris "123.1" ou "123,1", j'obtiens : "1231" sans la décimale. Quand j'écris "123a", j'obtiens un Null comme prévu par le code.

    Mon converter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    // Nullable double converter
    public class NullDoubleConverter : IValueConverter
    {
    	public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    	{
    		return (value == null ? null : value);
    	}
     
    	public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    	{
    		if (value == null) return null;
     
    		string stringValue = value as string;
    		if (string.IsNullOrEmpty(stringValue)) return null;
     
    		double doubleValue;
    		if (double.TryParse(stringValue, NumberStyles.Any, culture, out doubleValue)
    			|| double.TryParse(stringValue, NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out doubleValue)
    			|| double.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out doubleValue))
    			return doubleValue;
     
    		//if (double.TryParse(stringValue.Substring(0, stringValue.Length - 1), NumberStyles.Number, CultureInfo.CurrentUICulture, out doubleValue))
    			//return doubleValue;
     
    		return null;
    	}
    }
    Je précise que par défaut, la CultureInfo.CurrentCulture est réglée sur "fr-FR" (j'en ai vérifié la valeur au sein du converter), mais le fait de changer par "en-US" ne change rien en-dehors du fait que la virgule n'est plus du tout considérée comme un caractère valide pour la décimale (écrire "123,1" rend donc le champs vide).

    Deuxième précision, je trouve que la doc n'est pas terrible concernant les converters, et donc je me suis posé la question d'une éventuelle inversion de la source et de la target... (pas du tout clair dans ma tête). Même si je n'ai pas mieux compris ce point, le fait d'inverser le code des méthodes "Convert" et "ConvertBack" n'a pas changé mon problème...

    Une idée ? Une explication ? Je sais déjà qu'il y a d'autres méthodes que le converter, mais peu importe, j'aimerais quand même comprendre à quel endroit je me plante...

    Merci par avance.

  2. #2
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Sur quel trigger tu fais la mise-à-jour du ViewModel (je veux dire dans le xaml : PropertyChanged ? LostFocus ?) ?

    Par ailleurs le test que tu fais dans la méthode Convert ne sert à rien : tu peux directement renvoyer value.

  3. #3
    Membre régulier
    Homme Profil pro
    Médecin
    Inscrit en
    Mai 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2019
    Messages : 8
    Par défaut
    Bonjour,

    Merci pour ta réponse. Oui le test ne sert à rien, c'est parce que j'ai oublié de corriger, je venais de faire des tests dans cette méthode avec double.Parse().

    Sinon, je déclenche l'event PropertyChanged.

  4. #4
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    PropertyChanged va activer le Binding à chaque modification du champs texte (y compris quand tu as par exemple "123,", ce qui est une valeur invalide) ; essaie avec le LostFocus.

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    il faut "trapper" le "currentculture" ...
    code revu du converter;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     public class NullDoubleConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return value ;
            }
     
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value == null) return null;
     
                string stringValue = value as string;
     
                CultureInfo ci = CultureInfo.CurrentCulture;
                double val;
                if (double.TryParse(stringValue, NumberStyles.Any, ci, out val))
                {
                    return val;
                }
                else if (double.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out val))
                {
                    return val;
                }
     
     
                return null;
            }
        }
    bon code...

  6. #6
    Membre régulier
    Homme Profil pro
    Médecin
    Inscrit en
    Mai 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2019
    Messages : 8
    Par défaut
    Merci pour vos réponse.

    Alors petit détail : je bosse avec Xamarin.Forms, donc il n'y a pas l'évènement LostFocus. En revanche il y a un évènement Unfocused, mais je n'ai pas réussi à l'invoquer comme il faut...

    Pour le moment j'ai juste fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Entry Text="{Binding MyProperty, Converter={StaticResource doubleConverter}, UpdateSourceEventName=Unfocused}" />
    et ça ne fonctionne pas... Probablement parce que l'évènement doit être implémenté dans le code-behind ? Mais je ne sais absolument pas comment m'y prendre. Et quand je cherche "LostFocus event mvvm" sur Google pour m'inspirer, les implémentations données en exemples sont complexes et me font penser que je vais finir par craquer et faire un Binding entre ma vue et un doublon "string" de chaque propriété qui fera la conversion...

    Mais je trouve plus "propre" de passer par un converter, qui est réutilisable et m'évite de créer des propriétés "factice" dans tous mes viewmodels.

    @MABROUKI : merci, mais je pense que le problème ne vient pas du converter en fait, car lorsque j'initialise ma propriété par un double dans mon viewmodel (par exemple : 10.43), je peux ensuite modifier à ma guise ce nombre dans mon Entry, du moment que cela reste un double valide. Donc je pense que Noxen a bien éclairé ma situation avec la gestion du "," ou du "." en fin de string, qui ne peut pas être converti en un double valide...

Discussions similaires

  1. Afficher des chars/int/double/.. sans String avec System.out.print
    Par Seloa dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 18/01/2017, 09h14
  2. Réponses: 7
    Dernier message: 02/10/2014, 17h13
  3. Réponses: 5
    Dernier message: 06/02/2007, 13h46
  4. [C/C++] afficher des doubles dans une message box
    Par lalaurie40 dans le forum MFC
    Réponses: 1
    Dernier message: 24/05/2005, 14h55
  5. Réponses: 4
    Dernier message: 31/05/2004, 12h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo