我正在測驗在我的應用程式中使用正則運算式作為屬性,但它根本不起作用。
public partial class MainWindow : Window
{
[Required]
[RegularExpression(@"^[\d] ")]
public string number { get; set; }
public MainWindow()
{
InitializeComponent();
number = "sometext";
}
}
不會拋出任何錯誤,并且 number 接受任何內容而無需關心 RegularExpression 屬性。
我怎樣才能讓數字只接受正則運算式中提到的內容?通常我會在 setter 中進行驗證,但最近了解了屬性并希望使用它。
謝謝。
uj5u.com熱心網友回復:
您的系結源必須實作該IDataErrorInfo介面。然后您可以在系結上設定ValidatesOnDataErrors和屬性NotifyOnValidationError。
請參閱下面的簡化示例。
用于處理屬性更改和驗證的基類。
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));
}
}
模型,派生自上述基類。
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();
}
}
}
一個簡單的視圖模型設定為視窗的DataContext.
internal class ViewModel
{
public Model Model { get; set; } = new Model();
}
最后是窗戶。
<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>

uj5u.com熱心網友回復:
感謝您的評論。我用這個網站上的一些資訊修改了代碼。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());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/384780.html
下一篇:WPF執行緒安全和頁面之間的通信
