2017-01-10 6 views
0

Je le XAML suivant:WPF ValidationRule Dropping Point décimal

  <TextBox Name="LevyWageLimitFormulaID_TextBox" 
        Width="150" 
        HorizontalAlignment="Center" 
        Grid.Row="4" Grid.Column="1"> 
       <TextBox.Text> 
        <Binding Path="SelectedStateRule.LevyRule.WageLimitFormulaID" 
          UpdateSourceTrigger="PropertyChanged"> 
         <Binding.ValidationRules> 
          <vm:NumericValidator ValidatesOnTargetUpdated="True" /> 
         </Binding.ValidationRules> 
        </Binding> 
       </TextBox.Text> 
      </TextBox> 

Le validateur est défini comme tel:

/// <summary> 
/// Numeric Validator to make sure value is numeric 
/// </summary> 
public class NumericValidator : ValidationRule 
{ 
    /// <summary> 
    /// Validate field is blank or contains only numbers 
    /// </summary> 
    /// <param name="value"></param> 
    /// <param name="cultureInfo"></param> 
    /// <returns></returns> 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     Decimal _number; 
     if (!Decimal.TryParse((value as string), out _number) && !String.IsNullOrEmpty(value as string)) 
     { 
      return new ValidationResult(false, "Value must be numeric"); 
     } 

     return ValidationResult.ValidResult; 
    } 
} 

Cela fonctionne bien jusqu'à ce que je tente de saisir un nombre décimal. Si j'entre '10.' dans la zone de texte, le point décimal est supprimé (l'utilisateur ne voit jamais le point décimal apparaître dans la zone de texte). Si j'entre '100', puis déplacez le curseur manuellement et ajoutez un point décimal pour faire la valeur '10.0' la validation fonctionne et le point décimal reste.

Je sais que cela est causé par la partie out _number du Decimal.TryParse en conjonction avec la validation effectuée dès que la propriété est modifiée (ce qui est l'une des exigences), mais est-il un moyen de corriger cette méthode de telle sorte que Je peux taper '10.' et le point décimal reste dans la zone de texte?

Répondre

1

Ceci n'est pas provoqué par votre ValidationRule. Si vous supprimez temporairement la ValidationRule, vous rencontrerez le même comportement.

Le problème est que la propriété source decimalne peut pas être réglé à autre chose qu'une valeur decimal et « 10 » n'est en effet pas une valeur decimal valide.

Ce que vous pouvez faire est de se lier à une enveloppe string propriété qui définit la propriété decimal:

//add this wrapper property to your class: 
private string _wrapper; 
public string Wrapper 
{ 
    get { return _wrapper; } 
    set 
    { 
     _wrapper = value; 
     decimal d; 
     if (Decimal.TryParse(_wrapper, out d)) 
      WageLimitFormulaID = d; 
    } 
} 

private decimal _wageLimitFormulaID; 
public decimal WageLimitFormulaID 
{ 
    get { return _wageLimitFormulaID; } 
    set { _wageLimitFormulaID = value; } 
} 

<TextBox Name="LevyWageLimitFormulaID_TextBox" 
        Width="150" 
        HorizontalAlignment="Center" 
        Grid.Row="4" Grid.Column="1"> 
    <TextBox.Text> 
     <Binding Path="SelectedStateRule.LevyRule.Wrapper" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <vm:NumericValidator ValidatesOnTargetUpdated="True" /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 
+0

Oui, vous avez raison. Mais en général, cette approche n'est pas très utile. Vous devriez ajouter un wrapper pour toutes les propriétés. Je suppose qu'il serait préférable de trouver le contrôle "Decimal text box" et de l'utiliser partout où vous avez besoin de liaison aux valeurs décimales. –

+0

La seule différence est que "cette approche" serait implémentée dans le contrôle. Vous ne pouvez toujours pas définir une propriété décimale à autre chose qu'une décimale qui est le point principal ici. – mm8