double과 바인딩하는 TextBox에 소수점을 입력 할 수 없습니다!

3835 단어 .NETWPFXamlMVVMC#

배경


  • C# + XAML
  • TextBox가 숫자 형식( int 또는 double )에 바인딩됨
  • 실시간으로 입력 값으로 바인딩 된 속성 업데이트
  • <TextBox Text="{Binding Path=Number, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    
    TextBox.Text 속성을 숫자 형식의 Number와 바인딩합니다.
    Mode=TwoWay이므로 TextBox를 입력하면 해당 값을 바인딩하는 Number에 씁니다. (이것은 TextBox의 기본 동작이므로 작성하지 않아도됩니다.)

    또, UpdateSourceTrigger=PropertyChanged 라고 하고 있기 (위해)때문에, TextBox 의 디폴트의 동작인 포커스가 벗어났을 때가 아니고, 값을 입력한 순간에 Number 에 기입합니다.

    int(long)라고 확실!



    바인딩 Numberint 또는 long와 같은 정수형이면 아무런 문제없이 작동합니다!

    덧붙여서, 숫자 이외의 문자열을 넣었을 경우는, 테두리가 붉어지고, 입력에 잘못이 있는 것도 자동적으로 표시해 줍니다!
    입력에 오류가 있으면 바인드Number도 업데이트되지 않습니다.



    얼마나 편리!

    double(float)라면…



    그런데, 바인드 하고 있는 Number 하지만, doublefloat 등 소수점 이하를 포함한 수치형이 되면, 문제가 생깁니다!

    소수점을 입력할 수 없습니다!

    「123.45」라고 왼쪽의 1부터 순서대로 입력해 가면, 소수점이 입력되지 않고 「12345」가 되어 버립니다!

    소수점을 전혀 입력할 수 없는가 하면, 그렇지 않고, 「12345」라고 입력한 후, 「3」과 「4」사이에 커서를 놓고, 「.」를 입력하면, 올바르게 「123.45」가 됩니다 .

    즉, 숫자열의 마지막(말미)에 소수점을 입력할 수 없습니다!

    무슨 일이야? (추측)


    System.Windows.Data Error: 7 : ConvertBack cannot convert value '123a' (type 'String'). BindingExpression:Path=Model.Number1; DataItem='SimpleCalcViewModel' (HashCode=20876819); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') FormatException:'System.FormatException: 入力文字列の形式が正しくありません。
       場所 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
       場所 System.Number.ParseInt64(String value, NumberStyles options, NumberFormatInfo numfmt)
       場所 System.String.System.IConvertible.ToInt64(IFormatProvider provider)
       場所 System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
       場所 MS.Internal.Data.SystemConvertConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
       場所 System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'
    

    수치 이외를 입력했을 때에, Visual Studio 의 출력 윈도우에 나오는 예외의 백 트레이스로부터, 다음과 같은 메카니즘이 되어 있는 것 같습니다.
  • TextBox에 숫자(문자) 입력
  • 전체 입력 문자열을 Number.ParseInt64 또는 Number.ParseDouble 메서드를 사용하여 숫자로 변환
  • 변환이 성공하면 숫자를 TextBox에 표시합니다
  • .
  • 바인딩 된 속성에 쓰기

  • 여기서 문제가 되는 것이, 「변환에 성공하면, 그 수치를 TextBox에 표시한다」곳입니다.

    끝에 소수점을 입력하면 예를 들어 문자열 "123."이 됩니다.
    이것을 Number.ParseDouble 메소드가 변환하면(자), 123 이라고 하는 수치가 됩니다.
    123이라는 수치는, 표시하면 「123」이 되어, 소수점은 없어져 버립니다!

    어떻게해야합니까? (HELP!)



    그럼, 어떻게 하면 좋을까요, 죄송합니다! 아직 모르겠어요!
    누군가, 교수해 주시면 다행입니다!
    UpdateSourceTrigger=PropertyChanged 를 취하면 좋지만, 실시간으로 갱신되지 않게 되어 버리니까요. 실시간으로 업데이트하고, 마지막에 소수점을 입력하고 싶습니다만…

    해결편⁉ , 완결편‼ 에 계속한다.

    좋은 웹페이지 즐겨찾기