WPF中,当用户清空文本框时,文本框未将值设置为null。

3

我有一个文本框:

<TextBox FontSize="10">
    <TextBox.Text>
        <Binding Path="EstatusAdministrativo" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <validations:IsRequiredValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

这个文本框绑定到ViewModel中的一个变量,它看起来像这样:

private string _EstatusAdministrativo;
public string EstatusAdministrativo {
 get {
  return _EstatusAdministrativo;
 }
 set {
  _EstatusAdministrativo = value;
  OnPropertyChanged();
 }
}

文本框内的验证如下所示:
public class IsRequiredValidationRule: ValidationRule {
 public override ValidationResult Validate(object value, CultureInfo cultureInfo) {
  string strValue = Convert.ToString(value);
  if (string.IsNullOrWhiteSpace(strValue))
   return new ValidationResult(false, $ "Por favor llenar este campo.");
  return new ValidationResult(true, null);
 }
}

当我删除文本框中的所有字符时,EstatusAdministrativos的值并没有设置为null。当我清空文本框时,它不会触发set方法。为什么会发生这种情况,我该如何解决?

你尝试过使用 IsNullOrEmpty 而不是 IsNullOrWhiteSpace 吗? - Norbert Forgacs
我曾经遇到过一个类似的问题,即将TextBox绑定到一个空int属性。当文本被删除时,空文本框从未通过绑定设置为null值。当我在Xaml绑定中添加TargetNullValue=''时,它就可以正常工作了。 - hillstuk
3个回答

2
当验证规则失败时,如果没有设置ValidationStep属性为UpdatedValue,则源属性不会被设置:
<validations:IsRequiredValidationRule ValidationStep="UpdatedValue" />

这将导致验证规则在源属性已设置之后运行。您可以在this博客文章中了解更多信息。
如果您需要更多控制,则应该摆脱验证规则并在您的视图模型类中实现INotifyDataErrorInfo接口。

1

代替

return new ValidationResult(true, null);

你应该调用。
return ValidationResult.ValidResult;

顺便提一下,我更喜欢在我的视图模型中使用 IDataErrorInfo。 - blindmeis

1

我已将其设置为false,但不起作用。我已从Binding.ValidationRules中删除了验证规则,并将变量设置为“”,但我需要保留验证。有没有办法做到这一点? - Paul Miranda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接