如何约束TextBox

时间:2009-06-30 21:35:58

标签: wpf textbox wpf-controls constraints

如何设置TextBox以仅获取特定值。例如DateTime输入框,其中包含已定义的格式设置。

4 个答案:

答案 0 :(得分:6)

如何使用WPF Framework附带的绑定验证。

像这样创建一个ValidationRule

public class DateFormatValidationRule : ValidationRule
{
  public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
  {
     var s = value as string;
     if (string.IsNullOrEmpty(s))
        return new ValidationResult(false, "Field cannot be blank");
     var match = Regex.Match(s, @"^\d{2}/\d{2}/\d{4}$");
     if (!match.Success)
        return new ValidationResult(false, "Field must be in MM/DD/YYYY format");
     DateTime date;
     var canParse = DateTime.TryParse(s, out date);
     if (!canParse)
        return new ValidationResult(false, "Field must be a valid datetime value");
     return new ValidationResult(true, null);
  }
}

然后将其添加到xaml中的绑定中,以及在字段无效时处理的样式。 (如果您倾向于完全更改控件,也可以使用Validation.ErrorTemplate。)这个将ValidationResult文本作为工具提示,将框放到红色。

    <TextBox x:Name="tb">
        <TextBox.Text>
            <Binding Path="PropertyThatIsBoundTo" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <val:DateFormatValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
        <TextBox.Style>
            <Style TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <Trigger Property="Validation.HasError" Value="true">
                        <Setter Property="ToolTip"
                                Value="{Binding RelativeSource={RelativeSource Self},
                            Path=(Validation.Errors)[0].ErrorContent}"/>
                        <Setter Property="Background" Value="Red"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

建议采用样式并将其放入资源字典中,以便任何文本框在其自身验证失败时具有相同的外观。使XAML更加清洁。

答案 1 :(得分:5)

http://www.codeproject.com/KB/WPF/wpfvalidation.aspx

<TextBox Text="{Binding Path=Name}" />

一个功能。这只是检查字符串是否有内容。根据您要强制执行的确切格式,您的内容会更复杂:

public string Name
{
    get { return _name; }
    set
    {
        _name = value;
        if (String.IsNullOrEmpty(value))
        {
            throw new ApplicationException("Customer name is mandatory.");
        }
    }
}

答案 2 :(得分:0)

尝试使用MaskedTextBox。

它有类似DateTime定义的格式,还有更多。

答案 3 :(得分:0)

您还可以覆盖文本框上的输入方法,并在该点评估输入。这一切都取决于你的架构。

我之前已经覆盖了一些这样的任务:

  • OnPreviewTextInput
  • OnTextInput
  • OnPreviewKeyDown