调用 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:
我在这样的 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: