2012-04-02 2 views
2

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

<ControlTemplate x:Key="MyErrorTemplate" TargetType="{x:Type Control}"> 
    <StackPanel Orientation="Horizontal"> 
     <Border BorderBrush="Red" BorderThickness="2" CornerRadius="3"> 
      <AdornedElementPlaceholder Name="MyAdorner" /> 
     </Border> 
     <Image Name="imgError" 
       Source="/MyAssembly;component/Images/ValidationIcon.png" 
       ToolTip="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/> 
    </StackPanel> 
</ControlTemplate> 

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

«Когда система проверки WPF обнаруживает недопустимое управление он создает и Adorner, который держит контроль (...), вставляет в него контроль и наборы, которые контролируют шаблон для содержания Validation.ErrorTemplate прилагается собственность.

Он позиционирует Adorner выше первоначального контроля, так что AdornedElementPlaceholder точно над контролем и давайте легко поместить шаблон управления контентом по сравнению с первоначальным контроля»(see more)

Как я могу выполнить такое же поведение для других функций? Я имею в виду использование «MyErrorTemplate» без системы проверки WPF, возможно ли это?

+0

Вы ищете интерфейс IDataErrorInfo WPF использует этот интерфейс для проверки объектов. (См. Здесь http://japikse.blogspot.fr/2009/07/idataerrorinfo-error-templates-and-wpf.html) –

+0

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

ответ

2

поэтому, если вы правильно поняли, что хотите иметь такую ​​же валидацию без проверки WPF, правильно?

подход, то на самом деле восстановить компоненты системы проверки WPF в:

  1. создать Dependency Property MyCustomErrorTemplate подключить шаблон для управления

  2. создать Dependency Property HasCustomError, чтобы включить с указанием ошибки

  3. в пределах MyCustomErrorTemplate_Changed подключить до HasCustomError_Changed, чтобы разрешить отображение/скрытие вашего ado rner

  4. создать/скопировать TemplatedAdorner класс, который затем показывая свой шаблон

Я рекомендую вам использовать .NET Reflector или ILSpy посмотреть на следующий код, чтобы получить некоторое представление о том, что происходит. Это на самом деле не очень сложное и трудно понять:

в PresentationFramework.dll:

  • System.Windows.Controls.Validation (особенно private static void ShowValidationAdornerHelper(DependencyObject targetElement, DependencyObject adornerSite, bool show, bool tryAgain)

  • MS.Internal.Controls.TemplatedAdorner (к сожалению, это внутреннее, так что вы должны либо скопировать его или использовать некоторые отражения на нем)

+1

Это сработало. Большое спасибо! BTW ILSpy камни! –

+0

рад, что я мог бы помочь =) –

0

Почему нет? Вы можете иметь аналогичные прикрепленные свойства MyValidation.Errors и HasErrors и заполнить их своей логикой. И вы можете иметь триггер, который заменяет ControlTemplate на ErrorTemplate, когда HasError является истинным. Я думаю, что этот простой подход сделает то, что вам нужно, хотя я не совсем уверен, что я точно понимаю, что вам нужно.

+0

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