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

18

Это немного 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, поэтому я уверен, что это не ставит перед собой цель.

    
задан Noel Kennedy 09.09.2010 в 13:55
источник

1 ответ

42

Трещил его.

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

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

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

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

    
ответ дан Noel Kennedy 10.09.2010 в 16:43
источник
  • Я советую тебе шляпу, сэр! У меня было расширение UserControl> Expander> Text в расширении VS. Но это не приведет к ошибкам IDataErrorInfo. Сделано образцовое приложение WPF для размещения UC - проблема сохраняется (VS Extn исключен). Сделал другую виртуальную машину, которая работала, исключая виртуальную машину. Затем я ударил ваш пост - добавили пару обработчиков событий Loaded в окно и UC. Разумеется, UC вернул нулевой AdornerLayer. Обернул содержимое расширителя AdornerDecorator, и он сработал! Замедлял меня на 2 дня. Живи, я знаю, думаю. Еще раз спасибо за упорство и время, чтобы задокументировать его для потомков! –  Gishu 14.10.2010 в 20:03
  • нет проблем! Я тоже потерял 2 дня :( –  Noel Kennedy 14.10.2010 в 20:48
  • Это только что зафиксировало мою проблему с окном Metro-стиля, в котором не было AdornerDecorator. Благодаря! –  mortware 06.08.2012 в 17:51
  • Спасибо @NoelKennedy –  Eldho 11.11.2015 в 07:24
  • Это решает ту же проблему при использовании ModernDialog современного пользовательского интерфейса. Если вы закроете содержимое ModernDialog с помощью AdornerDecorator, проблема будет устранена. Большое спасибо. –  Hüseyin Yağlı 18.03.2016 в 09:31