2 votes

Silverlight : conversion d'une valeur à l'aide de seuils

J'essaie de convertir une valeur en utilisant deux valeurs seuils, l'appel à la base de données renvoie trois variables

Double Score;
Double LowerThreshold;
Double HigherThreshold;

Si le score est inférieur au seuil inférieur, une image rouge s'affiche, s'il se situe entre les deux seuils, une image orange s'affiche et s'il est supérieur au seuil supérieur, une image verte s'affiche.

Actuellement, j'utilise un ValueConverter personnalisé, mais je ne suis pas sûr que ce soit la meilleure façon de procéder. Je fusionne les seuils haut et bas ensemble pour qu'ils ressemblent à ceci "30,50" et ensuite j'analyse les valeurs de la chaîne et je détermine quelle image afficher.

Voici le code que j'utilise pour le ValueConverter

public class ScoreConverter : IValueConverter
{

    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is double)
        {
            if (parameter is string)
            {
                if ((parameter as string).Contains(",")) 
                {
                    string[] thresholds = (parameter as string).Split(',');

                    int lowerThreshold;
                    int upperThreshold;

                    bool success;

                    success = int.TryParse(thresholds[0], out lowerThreshold);
                    if (!success)
                        return "Error";
                    success = int.TryParse(thresholds[1], out upperThreshold);
                    if (!success)
                        return "Error";

                    if ((double)value < lowerThreshold)
                    {
                        //red
                        return "/Red32.png";
                    }
                    else if ((double)value > upperThreshold)
                    {
                        //green
                        return "/Green32.png";
                    }
                    else
                    {
                        //amber
                        return "/Amber32.png";
                    }
                }
            }
        }
        return "Error";
    }

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return "Not Possible";
    }
}

Toute suggestion pour une meilleure approche serait appréciée,

Gracias

EDIT

Décidé d'utiliser le code suivant, le serveur renvoie la structure suivante

public class ScoreInformation
{
    public double Score { get; set; }

    public double lowerThreshold { get; set; }

    public double upperThreshold { get; set; }

}

Et voici le code qui le convertit et affiche l'image correcte

    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is ScoreInformation)
        {
            ScoreInformation si = (ScoreInformation)value;

            if (si.Score < si.lowerThreshold)
            {
                return "Red32.png";
            }
            else if (si.Score > si.upperThreshold)
            {
                //green
                return "Green32.png";
            }
            else
            {
                //amber
                return "Orange32.png";
            }
        }

        return "Grey32.png";
    }

2voto

viggity Points 5342

C'est certainement une façon de procéder, surtout si les plages doivent changer à chaque fois que vous utilisez la liaison. Toutefois, si vous réutilisez les mêmes valeurs à plusieurs reprises, vous pouvez déclarer des propriétés sur votre convertisseur de valeurs et les définir lors de l'initialisation.

public int upperThreshold { get; set; }
public int lowerThreshold { get; set; }

public string lowImage { get; set; }
public string middleImage { get; set; }
public string highImage { get; set; }

public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is double)
        {

            if ((double)value < lowerThreshold)
            {
                //red
                return lowImage;
            }
            else if ((double)value > upperThreshold)
            {
                //green
                return highImage;
            }
            else
            {
                //amber
                return middleImage;
            }

        }
        return "Error";
    }

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return "Not Possible";
    }
}

<local:RangeToImageConverter
    x:Name="MyRangeConverter"
    upperThreshold="30"
    lowerThreshold="50"
    lowImage="/red32.png"
    middleImage="/amber32.png"
    highImage="/green32.png"
    />

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