Валидация ErrorTemplate не отображается при ошибках данных - PullRequest
20 голосов
/ 09 сентября 2010

Это что-то вроде WPF whodunnit! Мои проверки храмы не появляются, когда ожидается

Проблема

В основном я использую IDataErrorInfo в своей модели представления, чтобы предоставить отзыв об ошибках ввода данных. Я вижу, что это вызывается и работает как положено, но шаблон ошибки проверки для связанного элемента управления никогда не отображается WPF!

Я пробовал использовать встроенный шаблон ошибки красной рамки по умолчанию для текстового поля, шаблон ошибки стиля и шаблон с жестким кодом. Ни один из них не отображается в случае ошибки данных.

Вот мой обязательный код xaml:

<TextBox x:Name="txtCaseNumber"  
Text="{Binding Path=CaseNumber, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>

Странно, ошибка попадает в коллекцию Validation.Errors. Следующий код приводит к тому, что мое сообщение об ошибке IDataErrorInfo отображается рядом со связанным элементом управления. Это заставляет меня думать, что проблема связана со стороной xaml, а не со стороной модели представления.

<ContentPresenter 
Content="{Binding ElementName=txtCaseNumber, Path=(Validation.Errors).CurrentItem}" />

Кроме того, System.Windows.Controls.Validation.GetHasError(txtCaseNumber) возвращает true.

Я принимаю WPF в winforms, если это имеет значение. Я не могу найти ссылки в своем коде или стилях на Validation или ErrorTemplate, поэтому я почти уверен, что это не является собственной целью стиля.

1 Ответ

44 голосов
/ 10 сентября 2010

взломали.

Вложенное свойство ErrorTemplate использует слой adorner для отображения шаблонов ошибок при сбоях проверки данных, сообщаемых через IDataErrorInfo. Слой Adorner не всегда доступен для всех элементов управления в любых ситуациях. Ваш контроль или один из его родителей должен явно предоставить один.

Стандартный шаблон элемента управления Window содержит AdornerDecorator, который включает слой adorner для его дочерних элементов. Вот почему мое другое окно показало мои шаблоны ошибок просто отлично, потому что в этом окне использовался шаблон элемента управления по умолчанию

В окне, в котором не отображался шаблон ошибки, использовался стиль, предоставляющий шаблон ControlTemplate для моего окна. Этот шаблон управления не предоставил <AdornerDecorator>, следовательно, нет слоя adorner, чтобы показать мой шаблон ошибки.

Исправить было так же просто, как обернуть мой шаблон управления окном <AdornerDecorator>.

...