Как использовать шаблон проверки без механизма проверки? - PullRequest
2 голосов
/ 03 апреля 2012

Я использую шаблон элемента управления, чтобы показать ошибки проверки на каждом из моих элементов управления, используя встроенный механизм проверки 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 обнаруживает недопустимый элемент управления, она создает и украшатель, который содержит элемент управления (...), вставляет в него элемент управления и устанавливает этот шаблон элемента управления для содержимого Validation.ErrorTemplate.присоединенное свойство.

Он размещает автора над исходным элементом управления, так что держатель AdornedElementPlace находится точно над элементом управления и позволяет легко размещать содержимое шаблона элемента управления относительно исходного элемента управления "( подробнее )

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

Ответы [ 2 ]

2 голосов
/ 20 апреля 2012

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

Таким образом, подход заключается в том, чтобы перестроить компоненты системы валидации WPF:

  1. создайте свойство зависимостей MyCustomErrorTemplate для подключения вашего шаблона к элементу управления

  2. создайте свойство зависимости HasCustomError, чтобы включить отображение ошибки

  3. в MyCustomErrorTemplate_Changed подключите к HasCustomError_Changed, чтобы включить / выключить отображение вашего рекламодателя

  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 (к сожалению, это внутреннее, так что вы должны либо скопировать его, либо использовать какое-то отражение)

0 голосов
/ 14 апреля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...