2010-09-09 1 views
18

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

Проблема

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

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

Heres мой XAML код связывания:

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

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

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

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

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

ответ

41

Трещины.

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

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

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

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

+5

Я советую вам шляпу, сэр! У меня было расширение UserControl> Expander> Text в расширении VS. Но это не приведет к ошибкам IDataErrorInfo. Сделано образцовое приложение WPF для размещения UC - проблема сохраняется (VS Extn исключен). Сделал другую виртуальную машину, которая работала, исключая виртуальную машину. Затем я ударил ваш пост - добавили пару обработчиков событий Loaded в окно и UC. Разумеется, UC вернул нулевой AdornerLayer. Обернул содержимое расширителя AdornerDecorator, и он сработал! Замедлял меня на 2 дня. Живи, я знаю, думаю. Еще раз спасибо за упорство и время, чтобы задокументировать его для потомков! – Gishu

+0

нет проблем! Я потерял 2 дня на нем :( –

+1

Это только что зафиксировало мою проблему с окном Metro-стиля, которое не предоставило AdornerDecorator. Спасибо! – mortware

 Смежные вопросы

  • Нет связанных вопросов^_^