TextBox为空,但ViewModel在使用ValidationRule时仍包含最后一个字符



我有一个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,然后删除所有文本时,视图模型中绑定到TextBoxText属性的DataTextBox属性仍然具有值A

只有在使用ValidationRule时才会出现此行为。

为什么会出现这种情况以及如何解决?

对于验证规则,您可以通过ValidationStep属性指定何时应用它们。默认值为RawProposedValue,意思是:

在发生任何转换之前运行ValidationRule

这也意味着在更新绑定源属性的值之前进行验证。因此,如果验证规则失败,例如文本框为空,则该值将不会转回,因为它是无效的,从而导致DataTextBox属性的最后一个有效值不会被覆盖(在您的情况下为a(。

您可以在更新源之后通过指定不同的验证步骤来更改此行为:

  • UpdatedValue

    在更新源之后运行ValidationRule。

  • CommittedValue:

    在将值提交到源之后运行ValidationRule。

然后在检查验证规则之前更新该值。

<local:TextBoxValidation ValidationStep="UpdatedValue" />
<local:TextBoxValidation ValidationStep="CommittedValue" />

相关内容

  • 没有找到相关文章

最新更新