2

我想要达到的目标:

我正在尝试在 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'一样,我不能再访问代码中的工具提示(这是一个要求),因为它被转换为字符串。

4

1 回答 1

0

将“工具提示”的设置器更改为:

<Setter TargetName="ToolTip" Property="Text" Value="{Binding RelativeSource={x:Static RelativeSource.TemplatedParent}, Path=(Validation.Errors)[0].ErrorContent}"/>

当您使用时,Self您会绑定到TextBlock工具提示中的 。

如果这不起作用,请尝试RelativeSource.FindAncestor将祖先类型设置为TextBox.

于 2012-09-04T11:11:48.460 回答