1

我有一个只允许数字/货币的输入框。为此,我使用InputScope“CurrencyAmount”。

当我运行代码时,会弹出一个数字键盘,但允许用户输入多个小数点而不是一个小数点。

示例:文本框中应允许输入像“12.50”,但用户可以输入像“12....50”、“..12.5....0”等值。

如何限制允许的文本框值以匹配我的标准?

4

3 回答 3

3

我会选择一个行为和一个正则表达式。然后,您也可以轻松地将您的代码重用于其他文本框。

 public class RegexValidationBehavior : Behavior<TextBox>
{
    public static readonly DependencyProperty RegexStringProperty =
        DependencyProperty.Register("RegexString", typeof(string), typeof(RegexValidationBehavior), new PropertyMetadata(string.Empty));

    public string RegexString
    {
        get { return GetValue(RegexStringProperty) as string; }
        set { SetValue(RegexStringProperty, value); }
    }      

    protected override void OnAttached()
    {
        base.OnAttached();

        if (AssociatedObject != null)
        {
            AssociatedObject.TextChanged += OnTextChanged;
        }
        Validate();
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        if (AssociatedObject != null)
        {
            AssociatedObject.TextChanged -= OnTextChanged;
        }
    }

    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        Validate();
    }

    private void Validate()
    {
        var value = AssociatedObject.Text;
        if (value.IsNotEmpty() && RegexString.IsNotEmpty())
        {
            MatchAgainstRegex(value);
        }
    }

    private void MatchAgainstRegex(string value)
    {            
        var match = Regex.Match(value, RegexString);
        if (!match.Success)
        {
            AssociatedObject.Text = value.Remove(value.Length - 1);
            AssociatedObject.Select(AssociatedObject.Text.Length, 0);
        }           
    }
}

然后在您的 XAML 中编写类似的内容。

<TextBox InputScope="Number" Text="{Binding Amount, Mode=TwoWay}">
   <i:Interaction.Behaviors>
      <Control:RegexValidationBehavior RegexString="{Binding OnlyTwoDecimalsRegex}"/>
   </i:Interaction.Behaviors>
</TextBox>

例如,在您的 ViewModel 中,您指定一个正则表达式

public string OnlyTwoDecimalsRegex { get { return @"^([0-9]+)?([,|\.])?([0-9]{1,2})?$"; } }
于 2013-05-08T13:21:57.910 回答
2

我会将一个按键事件处理程序附加到您的文本框并验证您的输入是否与您的谓词匹配。

伪代码:

//...
//register event handler
yourTextBox.KeyDown += new KeyEventHandler(yourTextBox_KeyDown);
//...

//the keydown event
public void yourTextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (System.Text.RegularExpressions.Regex.IsMatch(yourTextBox.Text,"<enter a regular expression here>"))
         e.Handled = true;
    else e.Handled = false;
}
于 2013-05-07T21:13:55.160 回答
2

您可以尝试为文本框订阅 TextChanged 事件并在验证下运行 - 也适用于除 en-US 之外的其他语言环境。

string decimalsep = CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
int decimalSepCount = text1.Text.Count(f => f == decimalsep[0]);
if (decimalSepCount > 1)
{
   MessageBox.Show("Invalid input");
}
于 2013-05-07T21:20:58.347 回答