2017-01-10 3 views
0

У меня есть следующий код XAML:WPF ValidationRule каплепадение Десятичного

  <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> 

Валидатор определяются как таковые:

/// <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; 
    } 
} 

Это работает отлично, пока я пытаюсь ввести десятичное число. Если я введу '10.' в текстовое поле, то десятичная точка будет удалена (пользователь никогда не увидит десятичную точку в текстовом поле). Если я введу '100', а затем переместите курсор вручную и добавьте десятичную точку, чтобы сделать значение '10.0', валидация работает, и десятичная точка остается.

Я знаю, что это вызвано частью out _numberDecimal.TryParse в сочетании с проверкой подлинности, как только свойство изменено (что является одним из требований), но есть способ исправить этот метод таким образом, чтобы Я могу ввести '10.' и оставить десятичную точку в текстовом поле?

ответ

1

Это не вызвано вашим ValidationRule. Если вы временно удалите ValidationRule, вы будете испытывать такое же поведение.

Вопрос заключается в том, что свойство decimal источник не может быть установлен на что-то другое, чем значение decimal и «10.» действительно не является допустимым значением decimal.

Что вы можете сделать, это привязать к оберточной string собственности, которая устанавливает 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

Да, вы правы. Но в целом этот подход не очень полезен. Вы должны добавить оболочку для всех свойств. Я думаю, было бы лучше найти элемент управления «Десятичное текстовое поле» и использовать его везде, где вам нужна привязка к десятичным значениям. –

+0

Единственное отличие в том, что «этот подход» будет реализован в элементе управления. Вы по-прежнему не можете установить десятичное свойство для чего-то еще, чем десятичное значение, которое здесь является основным. – mm8

Смежные вопросы