IDataErrorInfo验证没有给出任何'ErrorContent'(参见编辑)

时间:2012-09-04 09:58:41

标签: c# validation xaml idataerrorinfo

我想要实现的目标:

我正在尝试在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代码已被大大删除(有关布局的代码)。


问题:

我面临的问题是ToolTip TextBlock上的绑定似乎从未显示任何错误。

除此之外,其他一切工作都很完美(DataValidation符合预期,我的TextBox边框变为蓝色)。

我几乎可以肯定我错过了什么,我似乎无法锻炼什么 - 这可能是非常简单的事情!

提前感谢您的回复。


修改

这是我在模板中设置工具提示的方式的问题。仍然不确定为什么它不起作用,但问题比我最初的想法简单得多!所以现在我想问题是为什么绑定在TextBlock中不起作用?

我需要这样做,好像我直接分配给'TextBox.ToolTip',我无法再访问代码中的ToolTip(这是一个要求),因为它被转换为字符串。

1 个答案:

答案 0 :(得分:0)

将“工具提示”的设定者更改为:

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

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

如果这不起作用,请尝试将{祖先类型设置为RelativeSource.FindAncestor的{​​{1}}。