Ошибки проверки WPF: настройка всплывающей подсказки с сообщением об ошибке
Почему текст об ошибках отсутствует?
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<Border ...>
<AdornedElementPlaceholder ...
ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
</Border>
...
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Я также заметил, что
<AdornedElementPlaceholder ...
ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
не удается, но нижеследующий результат, даже с тем же связыванием, почему это так? Не ссылается ли AdornedElementPlaceholder
на текстовое поле? Даже если это не так, не должна появляться подсказка?
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
Ответы
Ответ 1
Вы не можете поместить всплывающую подсказку в AdornedElementPlaceholder, я не думаю, что она вообще видна, она просто резервирует место для тех, кто ее использует (в вашем случае TextBox). Глядя на визуальное дерево с помощью Snoop, мы видим, что TemplatedAdorner попадает в другое место в VisualTree, чем в TextBox, поэтому теперь мы сможем найти TextBox из VisualTree. Мы можем найти его через AdornedElement, но мы все равно не сможем установить всплывающую подсказку.
![alt text]()
Единственное, что видимо здесь в TemplatedAdorner - это граница. Граница знает своего Ребенка - TemplatedAdorner, который, в свою очередь, знает свой AdornedElement - TextBox. Таким образом, мы могли бы установить ToolTip для границы с этим. (Тем не менее, эта привязка, похоже, не обновляет всплывающую подсказку для границы. Она работает, когда я смотрю на нее со Snoop, и после этого она отображается.)
<Border BorderBrush="Red"
BorderThickness="4"
ToolTip="{Binding RelativeSource={RelativeSource self},
Path=Child.AdornedElement.(Validation.Errors)[0].ErrorContent}">
Итак, у TextBox есть AttitudeProperty Validation, где мы можем найти ErrorContent, поэтому он должен установить свою собственную подсказку, как вы делали на последнем примере, иначе это не сработает.
Ответ 2
Я знаю, что опаздываю, но позвольте мне поделиться решением, которое я нашел, изучая этот вопрос: Пользовательский валидатор WPF с подсказкой.
В этом простейшем виде это ErrorTemplate
показывает только a Tooltip
с ErrorContent
для всего AdornedElement
.
<ControlTemplate x:Key="validationTemplate">
<Grid Background="Transparent"
ToolTip="{Binding Path=/ErrorContent}">
<AdornedElementPlaceholder />
</Grid>
</ControlTemplate>
Но, конечно, вы можете украсить его по желанию, например. с Tooltip
только для маркера.
<ControlTemplate x:Key="validationTemplate">
<Grid>
<Ellipse Fill="Red" Opacity="0.8" Width="10" Height="10"
HorizontalAlignment="Right" VerticalAlignment="Top"
ToolTip="{Binding Path=/ErrorContent}" />
<AdornedElementPlaceholder />
</Grid>
</ControlTemplate>
Поместите это Template
в Resources
, и все, что вам нужно сделать, это установить Validation.ErrorTemplate
.
Validation.ErrorTemplate="{StaticResource validationTemplate}"
Даже этот раздражающий триггер больше не нужен.
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>