2017-01-10 13 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' 값이 유효하게되고 소수점이 유지되도록하십시오.

이 내용은 Decimal.TryParse 부분의 out _number 부분이 속성이 변경되면 바로 수행된다는 사실을 알고 있지만 (이 중 하나는 요구 사항 중 하나임)이 방법을 수정하는 방법이 있습니다. 나는 '10.'을 입력 할 수 있으며 소수점은 텍스트 상자에 남아 있습니까?

답변

1

이것은 ValidationRule이 원인이 아닙니다. 일시적으로 ValidationRule을 제거하면 동일한 동작이 발생합니다.

decimal 소스 속성 값과 "10"이외의 값으로 설정할 수 없습니다. 실제로 유효한 decimal 값이 아닙니다.

당신이 할 수있는 것은 decimal 속성을 설정하는 래퍼 string 속성에 바인딩하는 것입니다

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

유일한 차이점은 "이 접근 방식"이 컨트롤에 구현된다는 것입니다. 여전히 10 진수를 10 진수가 아닌 다른 값으로 설정할 수는 없습니다. – mm8