WPF使用IDataErrorInfo进行数据校验

这篇博客将介绍如何使用IDataErrorInfo进行数据校验。下面直接看例子。一个Customer类,两个属性(FirstName, Age)

复制代码
class Customer
{
    public string FirstName
    {
        get;
        set;
    }

    public int Age
    {
        get;
        set;
    }
}
复制代码

将Customer类继承IDataErrorInfo,并实现它的属性。

复制代码
    class Customer : System.ComponentModel.IDataErrorInfo
    {
        public string this[string columnName]
        {
            get
            {
                string result = string.Empty;

                if(columnName == "FirstName")
                {
                    if(string.IsNullOrWhiteSpace(FirstName))
                    {
                        result = "Name cannot null or empty.";
                    }
                }
                else if(columnName == "Age")
                {
                    if(Age < 0)
                    {
                        result = "Age cannot less then zero.";
                    }
                }

                return result;
            }
        }

        public string Error
        {
            get
            {
                return null;
            }
        }

        public string FirstName
        {
            get;
            set;
        }

        public int Age
        {
            get;
            set;
        }
    }
复制代码

在UI中绑定Customer的FirstName,Age属性,并且当出现错误数据时触发验证。

复制代码
    <Window.Resources>
        <local:Customer x:Key="CustomerInstance"  FirstName="Sam Bent" Age="24" />
        <ControlTemplate x:Key="TextBoxErrorTemplate">
            <Grid>
                <Border BorderBrush="Blue" BorderThickness="1">
                    <AdornedElementPlaceholder/>
                </Border>
            </Grid>
        </ControlTemplate>
    </Window.Resources>
    <StackPanel Margin="10">
        <TextBox 
            Text="{Binding 
            Source={StaticResource CustomerInstance}, 
            Path=FirstName, 
            UpdateSourceTrigger=PropertyChanged, 
            ValidatesOnDataErrors=True}" 
            ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"
            Validation.ErrorTemplate="{x:Null}"
            Margin="0,5" />

        <TextBox Text="{Binding 
            Source={StaticResource CustomerInstance}, 
            Path=Age, 
            UpdateSourceTrigger=PropertyChanged, 
            ValidatesOnDataErrors=True}"
            Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}">
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Style.Triggers>
                        <Trigger Property="Validation.HasError" Value="True">
                            <Setter Property="Background" Value="Red" />
                            <Setter Property="ToolTip" 
                                    Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
    </StackPanel>
复制代码

将Customer的FirstName与Age属性分别绑定在两个TextBox中,设置ValidatesOnDataErrors=True来触发验证。将错误信息绑定在TextBox的ToolTip属性上,

ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" 或者

ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"或者

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

另外可以对ErrorTemplate进行定制,例如上面代码中的TextBoxErrorTemplate。

运行结果:

代码点击这里下载,感谢您的阅读。

posted @   Yang-Fei  阅读(5641)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示