我想要达到的目标:
我正在尝试在 TextBoxes 中实现相当简单的数据验证。如果不符合验证规则,则 TextBox 边框变为红色,并在其 ToolTip 中显示错误消息。
我正在使用 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
Style="{DynamicResource GeneralTextBoxStyle}"
>
<TextBox.Text>
<Binding
Path="Answer"
Mode="TwoWay"
UpdateSourceTrigger="PropertyChanged"
ValidatesOnDataErrors="True"
ValidatesOnExceptions="True"
/>
</TextBox.Text>
</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 代码已被大量精简(仅涉及布局的代码)。
问题:
我面临的问题是 ToolTip TextBlock 上的绑定似乎从未显示任何错误。
除此之外,其他一切都运行良好(DataValidation 符合预期,我的 TextBox 的边框变为蓝色)。
我几乎可以肯定我错过了一些东西,我似乎无法锻炼什么 - 这可能是非常简单的事情!
提前感谢您的回复。
编辑:
这是我在模板中设置工具提示的方式的问题。仍然不确定为什么它不起作用,但是问题比我最初想象的要简单得多!所以现在我想问题是为什么绑定在 TextBlock 中不起作用?
我需要这样做,就好像我直接分配给'TextBox.ToolTip'一样,我不能再访问代码中的工具提示(这是一个要求),因为它被转换为字符串。