调用 post 方法后将代码中的错误设置为 xaml

Set errors from code to xaml after calling a post method

我在这样的 xaml 表单中使用 ValidationRules

      <TextBox Name="email">
            <TextBox.Text>
                  <Binding Path="email" UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                              <local:NotEmptyString  ValidationStep="RawProposedValue" />
                        </Binding.ValidationRules>
                  </Binding>
            </TextBox.Text>
      </TextBox>

在代码中,在我的交易开始之前,我会检查这样的错误

email.GetBindingExpression(TextBox.TextProperty).UpdateSource();

if (Validation.GetHasError(item))
      return false;

我有 类 为我需要的每个验证继承 ValidationRule,这工作正常。

但是现在,我需要调用一个 post 方法,而那个方法 returns 我会在电子邮件已经存在时出现 JSON 错误,我想将该错误显示为验证错误。有没有办法将错误设置为文本框?

如果您想坚持这种非常不灵活的绑定验证,那么最简单的解决方案就是使用 Binding.ValidatesOnException:

<TextBox Name="email">
  <TextBox.Text>
    <Binding Path="email" 
             UpdateSourceTrigger="PropertyChanged"
             ValidatesOnException="True">
      <Binding.ValidationRules>
        <local:NotEmptyString  ValidationStep="RawProposedValue" />
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

然后验证您的 JSON 回复:

class ViewModel
{
  public string Email { get; set; }

  private ValidateJsonResponse(Json jsonObject)
  {
    if (!JsonIsValid(jsonObject))
    {
      throw new ArgumentException("Email already exists.");
    }
  }
}

但是由于异常会对性能产生一些影响,因此您通常应该避免它们。您可以争辩说,如果输入验证失败是抛出异常的充分理由。我怀疑是。

或者实施第二个 ValidationRule 并触发绑定以执行它。您必须找到一种方法来访问 JSON 响应以检查它是否有效。由于 ValidationRule 在 XAML 中实例化并且不能有 DependencyProperty 来允许绑定,这可能会稍微复杂一些。这就是绑定验证不是很灵活的原因。 ValidationRule 绑定的实例与其余代码(例如视图模型)完全隔离。

推荐的模式是让您的视图模型实现他 INotifyDataErrorInfo 接口。有关实施的示例或链接,请参阅此 post: