Подтвердить что ты не робот

Validation ErrorTemplate, не отображающая ошибки данных

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

Проблема

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

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

Вот мой код привязки xaml:

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

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

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

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

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

4b9b3361

Ответ 1

Трещил его.

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

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

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

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