2010-11-10 18 views
0

J'ai la boîte de texte suivant dans mon application Silverlight:pourcentage CONCLUEZ zone de texte multiplie la valeur par 100

<TextBox Text="{Binding Model.PercentOfSale, Mode=TwoWay, StringFormat=p}"/> 

PercentOfSale est défini comme un double.

L'affichage dans la zone de texte comme prévu:

0,00%

Cependant, quand j'entrer une nouvelle valeur (disons 15) je reçois:

1,500.00 %

Donc la valeur est multipliée par 100 (incorrectement).

Mes utilisateurs ne vont pas vouloir entrer 0.15 comme valeur, alors qu'est-ce que je dois faire pour qu'il accepte 15 comme 15% et non 1.500%?

J'ai vu d'autres questions à poser comme

How to set WPF string format as percent wihout multiplying by 100?
Format decimal for percentage values?

Mais les solutions données ne fonctionne pas pour moi.

+1

Peut-être que vous devriez diviser vos entrées utilisateur par 100 à la place. Stocker 15% comme 0,15 a de nombreux avantages. Et msdn est clair sur la valeur multipliée par 100, donc ça ne me semble pas correct. http://msdn.microsoft.com/en-us/library/0c899ak8.aspx#SpecifierPct –

+0

@Nicolas - Je suppose que je m'attendais à une valeur que je suis entré à être divisé par 100 pour moi, mais peut-être que je suis naïf. – ChrisF

Répondre

0

Qu'en est-il de l'utilisation des convertisseurs?
Si vous ne voulez pas modifier les valeurs d'entrée que vous pouvez convertir ensuite.
Here is example d'utilisation de convertisseurs.

+0

Je pense à un convertisseur, mais je m'attendais à ce que cela se produise "automatiquement" comme je l'ai spécifié un formateur. – ChrisF

3

J'ai fini par changer setter de manière à modifier la valeur de la propriété:

private decimal percentOfSale; 
public decimal PercentOfSale 
{ 
    get 
    { 
     return percentOfSale; 
    } 
    set 
    { 
     percentOfSale = value/100; 
     RaisePropertyChangedEvent("PercentOfSale"); 
    } 
} 

Alors mon XAML devient:

<TextBox Text="{Binding PercentOfSale, Mode=TwoWay, StringFormat=p}"/> 

et quand je charge mon modèle je:

this.percentOfSale = Model.PercentOfSale; 

notez le minuscule "p" - ceci évite la mise à l'échelle de la configuration initiale de sorte que le StringFormat dans la liaison fonctionne correctement et lorsque la valeur est définie à partir de l'interface utilisateur, elle évolue également.

Alors quand je veux enregistrer les données dont je dispose:

Model.PercentOfSale = this.percentOfSale; 

En fait, je trouve que les pourcentages étaient stockés sous forme de valeurs de 0 à 100 (de 0 à 1) - ce n'est pas mon modèle de données & je aurait dû vérifier d'abord, donc cela veut dire que je besoin à l'échelle de la valeur sur la configuration initiale:

this.PercentOfSale = Model.PercentOfSale; 

Notez le majuscules « P ».

et économie:

Model.PercentOfSale = this.percentOfSale * 100; 

pour le ramener en conformité avec les données stockées dans la base de données.

Questions connexes