Если вы хотите придерживаться этой довольно негибкой проверки привязки, то простейшим решением будет использование 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
. См. Этот пост для примера или ссылок, касающихся реализации: Как добавить проверку для просмотра свойств модели или как реализовать INotifyDataErrorInfo