在 .NET 中使用 RegularExpression 作为属性

Using RegularExpression as attribute in .NET

我正在测试在我的应用程序中使用正则表达式作为属性,但它根本不起作用。

public partial class MainWindow : Window
{
    [Required]
    [RegularExpression(@"^[\d]+")]
    public string number { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        number = "sometext";
    }
 }

没有错误被抛出,数字接受任何东西而不关心 RegularExpression 属性。

如何让数字只接受正则表达式中提到的内容? 通常我会在 setter 中进行验证,但最近了解了属性并希望使用它。

谢谢。

感谢评论。我用这个网站上的一些信息修改了代码。 myTextbox 与数字绑定并且正在使用验证属性。但这仍然是接受我在文本框中写的所有内容。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        myTextBox.DataContext = this;         
    }

    [Required]
    [AcceptNumberAttribute]
    public string number { get; set; }        
 }

public sealed class AcceptNumberAttribute : ValidationAttribute

{

    public override bool IsValid(object value)
    {
        return new RegularExpressionAttribute(@"^[\d]$").IsValid(Convert.ToString(value).Trim());
    }

}

您的绑定源必须实现 IDataErrorInfo 接口。然后你可以在绑定上设置 ValidatesOnDataErrorsNotifyOnValidationError 属性。

请参阅下面的简化示例。

处理 属性 更改和验证的基础 class。


internal abstract class ValidatedObservableBase : INotifyPropertyChanged, IDataErrorInfo
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string this[string columnName]
    {
        get
        {
            var results = new List<ValidationResult>();
            var valid = Validator.TryValidateProperty(GetType().GetProperty(columnName)?.GetValue(this), new ValidationContext(this) { MemberName = columnName }, results);

            return valid ? null : results[0].ErrorMessage;
        }
    }

    public string Error
    {
        get => null;
    }

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

模型,源自上述基础class。


internal class Model : ValidatedObservableBase
{
    private string number;

    [Required(ErrorMessage = "Required error")]
    [RegularExpression(@"^[\d]+", ErrorMessage = "Regex error")]
    public string Number
    {
        get => number;
        set
        {
            number = value;
            OnPropertyChanged();
        }
    }
}

设置为 window 的 DataContext 的简单视图模型。


internal class ViewModel
{
    public Model Model { get; set; } = new Model();
}

最后,window。


<Window
    ...
    xmlns:local="clr-namespace:Demo"
    mc:Ignorable="d">
    <Window.DataContext>
        <local:ViewModel />
    </Window.DataContext>
    <StackPanel>
        <TextBox
            x:Name="TB"
            Margin="24,24,24,0"
            VerticalAlignment="Top"
            Text="{Binding Path=Model.Number, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" />
        <TextBlock
            Margin="24,4,24,24"
            Foreground="Red"
            Text="{Binding ElementName=TB, Path=(Validation.Errors)[0].ErrorContent}" />
    </StackPanel>
</Window>