我有一个TextBox
,我使用的是ValidationRule
。
<TextBox ..>
<TextBox.Text>
<Binding
Mode="TwoWay"
Path="DataTextBox"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validations:TextBoxValidation />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
以下是验证规则:
public class TextBoxValidation: ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
return (string.IsNullOrEmpty(value as string)) ?
new ValidationResult(false, "This textbox cannot be empty") :
new ValidationResult(true, null);
}
}
我的ViewModel
:中有此属性
private string? _DataTextBox = string.Empty; //by default, set it as empty.
public string? DataTextBox
{
get => _DataTextBox;
set { SetProperty(ref _DataTextBox, value); }
}
我注意到,当我键入TextBox
,例如ABCDEFG
,然后删除所有文本时,视图模型中绑定到TextBox
的Text
属性的DataTextBox
属性仍然具有值A
。
只有在使用ValidationRule
时才会出现此行为。
为什么会出现这种情况以及如何解决?
对于验证规则,您可以通过ValidationStep
属性指定何时应用它们。默认值为RawProposedValue
,意思是:
在发生任何转换之前运行
ValidationRule
。
这也意味着在更新绑定源属性的值之前进行验证。因此,如果验证规则失败,例如文本框为空,则该值将不会转回,因为它是无效的,从而导致DataTextBox
属性的最后一个有效值不会被覆盖(在您的情况下为a
(。
您可以在更新源之后通过指定不同的验证步骤来更改此行为:
-
UpdatedValue
在更新源之后运行ValidationRule。
-
CommittedValue
:在将值提交到源之后运行ValidationRule。
然后在检查验证规则之前更新该值。
<local:TextBoxValidation ValidationStep="UpdatedValue" />
<local:TextBoxValidation ValidationStep="CommittedValue" />