Используйте оба ValidationAdornerSite и ErrorTemplate одновременно - PullRequest
3 голосов
/ 07 ноября 2011

Мы отображаем наши ошибки с помощью Validation.ValidationAdornerSite на панели состояния. При использовании ValidationAdornerSite создается впечатление, что wpf отключает Validation.ErrorTemplate.

Что я могу сделать, чтобы добиться отображения ErrorTemplate? В настоящее время у нас есть компромисс, когда мы отображаем вещи только на сайте ValidationAdornersite, устанавливая его на MouseOver через Trigger, чтобы шаблон ErrorTemplate отображался, пока мышь находится вне элемента управления.

 <Style x:Key="ValidationStyle">
    <Setter Property="Validation.ErrorTemplate"
            Value="{StaticResource Default_ErrorTemplate}" />
    <Style.Triggers>
        <Trigger Property="UIElement.IsMouseOver"
                 Value="True">
            <Setter Property="Validation.ValidationAdornerSite"
                    Value="{Binding ValidationAdornerSite,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
        </Trigger>

        <Trigger Property="Validation.HasError"
                 Value="true">
            <Setter Property="FrameworkElement.ToolTip"
                    Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                    Path=(Validation.Errors)[0].ErrorContent}" />
        </Trigger>
    </Style.Triggers>
</Style>

1 Ответ

1 голос
/ 18 ноября 2011

Посмотрев с помощью ILSpy, как реализована проверка, я пришел к выводу, что это поведение нельзя изменить.

Гораздо проще сделать нечто подобное, как это делают ValidationAdornerSite и ValidationAdornerSiteFor. Определите два прикрепленных реквизита зависимостей с похожим поведением. Тогда вы используете его вместо стандартных реквизитов адонерзита:

 <Setter Property="gw:FormValidation.ValidationSite"
                    Value="{Binding ValidationAdornerSite,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />

...............................

 <TextBlock x:Name="PART_ValidationAdornerSite"
                       HorizontalAlignment="Center"
                       Text="{Binding RelativeSource={RelativeSource Self}, Path=(gw:FormValidation.ValidationSiteFor).(Validation.Errors)[0].ErrorContent, NotifyOnTargetUpdated=True}"
                       TargetUpdated="PART_ValidationAdornerSite_TargetUpdated"
                       TextBlock.Foreground="Red"/>

...............................

this.ValidationAdornerSite = this.PART_ValidationAdornerSite;

это окно, содержащее dp "ValidationAdornerSite". Помните, что это решение может быть упрощено, но оно соответствует моим потребностям, потому что мои проверенные элементы управления находятся в модулях (PRISM), которые не знают об окне (оболочке).

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