在 .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
接口。然后你可以在绑定上设置 ValidatesOnDataErrors
和 NotifyOnValidationError
属性。
请参阅下面的简化示例。
处理 属性 更改和验证的基础 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>
我正在测试在我的应用程序中使用正则表达式作为属性,但它根本不起作用。
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
接口。然后你可以在绑定上设置 ValidatesOnDataErrors
和 NotifyOnValidationError
属性。
请参阅下面的简化示例。
处理 属性 更改和验证的基础 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>