Проверка IDataErrorInfo не дает никакого ErrorContent (см. Редактирование)
Чего я хочу добиться:
Я пытаюсь реализовать довольно простую проверку данных в TextBoxes. Если правила проверки не соблюдены, граница TextBox становится красной, и в ее подсказке отображается сообщение об ошибке.
Я делаю это, используя IDataErrorInfo и Styles/Bindings:
Реализация IDataErrorInfo:
#region DataError Members
public string Error
{
get { return null; }
}
public string this[string propertyName]
{
get
{
string result = null;
if (propertyName == "Answer")
{
if (Answer != null)
{
if (this.Answer.Length < 1 || this.Answer.Length > 10)
result = "Invalid answer length - Must be between: 1 and 10 chars.";
}
}
return result;
}
}
#endregion
TextBox, который содержит привязку:
<TextBox
Style="{DynamicResource GeneralTextBoxStyle}"
>
<TextBox.Text>
<Binding
Path="Answer"
Mode="TwoWay"
UpdateSourceTrigger="PropertyChanged"
ValidatesOnDataErrors="True"
ValidatesOnExceptions="True"
/>
</TextBox.Text>
</TextBox>
Шаблон / Стиль TextBox:
<ControlTemplate x:Key="ErrorTextBoxTemplate" TargetType="{x:Type TextBox}">
<Border
x:Name="ErrorBorder"
BorderThickness="1"
BorderBrush="White"
>
<ScrollViewer
x:Name="PART_ContentHost"
VerticalAlignment="Center"
>
<ScrollViewer.ToolTip>
<ToolTip FontSize="14">
<TextBlock x:Name="ToolTip"/>
</ToolTip>
</ScrollViewer.ToolTip>
</ScrollViewer>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter TargetName="ToolTip" Property="Text" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
<Setter TargetName="ErrorBorder" Property="BorderBrush" Value="Blue"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="ErrorTextBoxStyle" TargetType="{x:Type TextBox}">
<Setter Property="Template" Value="{StaticResource ErrorTextBoxTemplate}"/>
</Style>
Примечание. Код XAML был значительно сокращен (код касается только макета).
Эта проблема:
Проблема, с которой я сталкиваюсь, заключается в том, что привязка к всплывающей подсказке TextBlock никогда не показывает никаких ошибок.
Кроме этого, все остальное работает отлично (DataValidation, как и ожидалось, и граница моего TextBox становится синим).
Я почти уверен, что что-то упустил, и я не могу тренироваться, что... Это, наверное, что-то чрезвычайно простое!
Заранее спасибо за ваши ответы.
РЕДАКТИРОВАТЬ:
Это проблема с тем, как я настроил всплывающую подсказку в шаблоне. До сих пор не уверены, почему это не работает, однако проблема намного проще, чем я думал! Итак, теперь я предполагаю, что вопрос заключается в том, почему привязка не работает внутри TextBlock?
Мне нужно сделать это таким образом, как если бы я назначил непосредственно TextBox.ToolTip, я больше не могу получить доступ к подсказке в коде (что является обязательным), так как она преобразуется в строку.
1 ответ
Измените установщик для "всплывающей подсказки" на:
<Setter TargetName="ToolTip" Property="Text" Value="{Binding RelativeSource={x:Static RelativeSource.TemplatedParent}, Path=(Validation.Errors)[0].ErrorContent}"/>
Когда вы используете Self
вы связываете с TextBlock
в твоей подсказке.
Если это не работает, попробуйте RelativeSource.FindAncestor
с типом предка, установленным на TextBox
,