2009-12-04 4 views
0

양의 정수 입력 만 허용하는 TextBox를 만들려고합니다. 문화권 고유의 서식을 자동으로 입력해야합니다 (이 경우 en-US이므로 ','기호를 구분 기호로 사용해야합니다). 큰 숫자). 그래서 :자동 culture 서식이있는 TextBox?

  • 1000의 항목이 텍스트 상자에 '1000'으로 표시해야합니다
  • 1000의 항목 등으로 표시해야하지만, 올바르게 해석 할 수 ... 현재

, 아니 이러한 자동 서식은 첫 번째 경우에서 이루어지며 두 번째 경우는 입력이 올바른지 (TryParse를 사용하여 올바른 숫자를 입력했는지 확인하기 위해 구현 한) ValidationRule에서 오류를 트리거합니다.

저는 여기서 세계화와 국제화 측면에서 새로운 생각을하고 있습니다. 그래서 나는 문화와 관련된 마술이 있는지 궁금합니다. 나는 실제 데이터에서 표시된 형식을 분리하고 형식을 자동으로 만들 수 있습니다. 입력하는 동안? 내가 '옆으로

public class PopulationValidationRule : ValidationRule 
    { 
     public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
     { 
      UInt64 popValue; 

      if (value == null) 
      { 
       return new ValidationResult(true, null); 
      } 
      else if (!UInt64.TryParse((string)value, NumberStyles.AllowThousands, null, out popValue)) 
      { 
       return new ValidationResult(false, "Value must be a valid number."); 
      } 

      return new ValidationResult(true, null); 
     } 
    } 

가 AS :

는 코드 숨김에서 텍스트 상자에 대한 XAML입니다 :

<TextBox 
       Foreground="{StaticResource WindowForegroundBrush}" 
       Background="{StaticResource EntryFieldBackgroundBrush}" 
       TextWrapping="NoWrap" 
       MaxLines="1" 
       MaxLength="100" 
       Margin="{StaticResource EntryFormTextBoxMargins}" 
       VerticalAlignment="Stretch" 
       RenderTransformOrigin="0.5,0.5" 
       HorizontalAlignment="Stretch" 
       VerticalContentAlignment="Center" 
       MinWidth="300" 
       MinHeight="30" 
       x:Name="PopTxtBox" 
       MaxWidth="300" 
       TextChanged="PopTxtChange"> 
       <Binding 
        Path="locationPopulation"             
        Source="{StaticResource locDT}" 
        UpdateSourceTrigger="PropertyChanged"> 
        <Binding.ValidationRules> 
         <c:PopValidationRule /> 
        </Binding.ValidationRules> 
       </Binding> 

그리고 여기에 내가 작성한 ValidationRule입니다 TextBox가 비어있는 상태로 표시되도록하려면 TextBox는로드시 '0'을 표시하고 TextBox를 비워두면 ValidationRule에서 허용하더라도 유효성 검사 오류가 발생합니다. 내가 모을 수있는 한, TextBox를 숫자 값으로 바인딩하면 null 값이 허용되지 않습니다. 저것을 또한 취급하는 어떤 방법 있는가?

+0

형식에 관해서. 바인딩에서 전체 숫자 서식 시스템을 사용할 수 있어야합니다. 예를 들어, {Binding ..., StringFormat = '\ {0 : 0; (0); \}'} "은 음수 인 경우()와 음수가없는 경우 http://msdn.microsoft.com/ en-us/library/0c899ak8.aspx – adrianm

+0

글쎄, 그게 바로 내가 뭘? .. 그러나 내 바인딩에서 StringFormat 사용할 때 "StringFormat '변환기 값을 변환하지 못했습니다 오류가 발생합니다. '0'(type 'UInt64'); "등 ... 내가 생각할 수있는 유일한 것은 IValueConverter를 구현하는 것이지만 이상하게 보입니다. String과 기본 숫자 형식입니까? 아니면 누락 된 뭔가가 있습니까? – Ryuching

+0

흠 여기에 뭔가가 빠져 있습니다. 위 코드에서와 같이 바인딩을 사용하면 StringFormat 변환기가 실패하지만, 바인딩을 제거하면 대신 "텍스트 = ...."행을 포함하고 바인딩 및 StringFormat 변환기를 추가하면 작동합니다. 제가 명시 적으로 변환기에 대한 문화권을 지정하는 한 ... 이제 어떻게 다시 ValidationRules을 얻는 지 알아내는 것입니다. – Ryuching

답변

0

글쎄, 내 만족을 위해 노력을 얻었다. (내가 처음부터 그렇게하지 않은 이유는 확실치)

  • 분명히, 나는 특별히 TextBox.Text 요소에 적용 바인딩을 지정했다. 그 후 StringFormat은 광고 된대로 작동합니다.

  • 나는 우리가해야 찾고있는 값으로 그룹 단락을 제거 PreviewLostKeyboardFocus 이벤트에 대한 다소 단순한 이벤트 처리기를 추가 한 포맷되지 않은 ULONG - 디스플레이 포맷이 다음 따라서, 우리의있는 StringFormat 변환에 의해 적용 기대되는 가치는 이미 그러한 형식을 가지고 있으면 안된다. 이벤트는 또한 좋은 측정을 위해 잠재적 인 선행 제로를 제거합니다.

나는 위의 자동 보정 일부 정규 표현식 - 부두로, 더 예쁜 방식으로 수행 될 수있다 생각하지만, 나는 특정 브랜드의 houngan 아니에요 때문에, 이것이 내가 생각 해낸 것입니다.

의견과 아이디어를 보내 주셔서 감사합니다.내 텍스트 상자의 코드 숨김

:

<TextBox 
       Foreground="{StaticResource WindowForegroundBrush}" 
       Background="{StaticResource EntryFieldBackgroundBrush}" 
       TextWrapping="NoWrap" 
       MaxLines="1" 
       MaxLength="100" 
       Margin="{StaticResource EntryFormTextBoxMargins}" 
       VerticalAlignment="Stretch" 
       RenderTransformOrigin="0.5,0.5" 
       HorizontalAlignment="Stretch" 
       VerticalContentAlignment="Center" 
       MinWidth="300" 
       MinHeight="30" 
       x:Name="PopTxtBox" 
       MaxWidth="300" PreviewLostKeyboardFocus="PopTxtBoxLeavePreview"           
       > 
       <TextBox.Text> 
        <Binding 
         Path="locationPopulation"             
         Source="{StaticResource locDT}"       
         UpdateSourceTrigger="LostFocus" 
         StringFormat="{}{0:#,#;;}"> 
         <Binding.ValidationRules> 
          <dataTemplates:PopValidationRule /> 
         </Binding.ValidationRules> 
        </Binding> 
       </TextBox.Text> 

      </TextBox> 

ValidationRule :

public class PopValidationRule : ValidationRule 
    { 
     public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
     { 
      ulong popVal; 

      if (!ulong.TryParse((string)value, out popVal) && !(value == null)) 
      { 
       return new ValidationResult(false, "ValidationResult: Not a number."); 
      } 

      return new ValidationResult(true, null); 
     } 
    } 

PreviewLostKeyboard 이벤트 :

private void PopTxtBoxLeavePreview(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e) 
    { 
     TextBox senderBox = (TextBox)sender; 

     //remove leading 0:s. 
     senderBox.Text = senderBox.Text.TrimStart('0'); 
     //remove spaces as group separator 
     senderBox.Text = senderBox.Text.Replace(" ", ""); 
     //remove commas as group separator 
     senderBox.Text = senderBox.Text.Replace(",", ""); 
     //remove singlequotes as group separator 
     senderBox.Text = senderBox.Text.Replace("'", "");    
    } 
} 
0

당신은 this 유용, CultureInfo를 클래스에

This 기사를 주목하는 것은 좋은 설명이 포함되어 찾을 수 있습니다 ..

+0

포인터 주셔서 감사! – Ryuching

관련 문제