如何在WPF程序中使用IDataErrorInfo.Error?

如何在WPF程序中使用IDataErrorInfo.Error?,wpf,validation,textbox,idataerrorinfo,Wpf,Validation,Textbox,Idataerrorinfo,我有一个这样的物体: public class Person : IDataErrorInfo { public string PersonName{get;set;} public int Age{get;set;} string IDataErrorInfo.this[string propertyName] { get { if(propertyName=="PersonName")

我有一个这样的物体:

public class Person : IDataErrorInfo
{
    public string PersonName{get;set;}
    public int Age{get;set;}

    string IDataErrorInfo.this[string propertyName]
    {
        get
        {
            if(propertyName=="PersonName")
            {
                if(PersonName.Length>30 || PersonName.Length<1)
                {
                    return "Name is required and less than 30 characters.";
                }
            }
            return null;
        }
    }

    string IDataErrorInfo.Error
    {
        get
        {
            if(PersonName=="Tom" && Age!=30)
            {
                return "Tom must be 30.";
            }
            return null;
        }
    }
}
公共类人员:IDataErrorInfo
{
公共字符串PersonName{get;set;}
公共整数{get;set;}
字符串IDataErrorInfo。此[string propertyName]
{
得到
{
如果(propertyName==“PersonName”)
{

如果(PersonName.Length>30 | | PersonName.Length,下面是一个改编自的示例,它显示了如何在工具提示中显示错误:

<TextBox>
    <TextBox.Style>
        <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, 
                       Path=(Validation.Errors)[0].ErrorContent}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

您应该修改文本框样式,以便它显示属性的错误。下面是一个简单的示例,将错误显示为工具提示:

<Style TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
                        Path=(Validation.Errors).CurrentItem.ErrorContent}" />
            </Trigger>
        </Style.Triggers>
</Style>

只需将它放在app.xaml文件中的Application.Resources中,它将应用于应用程序的每个文本框:

<Application.Resources>
    <Style TargetType="TextBox">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
                            Path=(Validation.Errors).CurrentItem.ErrorContent}" />
                </Trigger>
            </Style.Triggers>
    </Style>
</Application.Resources>


Hi,我在IDataErrorInfo.Error.get上设置了一个断点,但它从未被触发。怎么了?@jgg-在这种情况下,
错误
get可能不会被调用。IDataErrorInfo.this
get会被调用,并且会被传递到
“PersonName”
“Age”
。因此您需要处理这两个属性,但现在只处理前者。我最终找到了一个解决方法,并发表了一篇文章。Error属性在WPF中没有真正使用。您甚至可以在其中抛出NotImplementedException。IDataErrorInfo被WPF使用“因为它已经存在”,但仅用于this[]部分。我认为这不是WPF中最漂亮的一个角落。@Robin,你可以发布这个问题的答案。这已经有3-4年了,没有公认的答案;)
<Application.Resources>
    <Style TargetType="TextBox">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
                            Path=(Validation.Errors).CurrentItem.ErrorContent}" />
                </Trigger>
            </Style.Triggers>
    </Style>
</Application.Resources>