Установить ошибки из кода в xaml после вызова метода записи - PullRequest
0 голосов
/ 22 апреля 2020

Я использую ValidationRules в моих формах xaml, таких как

      <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, и этот метод возвращает мне ошибку JSON, когда электронная почта уже существует, я хочу показать эту ошибку как ошибка проверки. Есть ли способ установить ошибку для TextBox?

1 Ответ

0 голосов
/ 23 апреля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...