zoukankan      html  css  js  c++  java
  • 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。

    运行结果:

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

  • 相关阅读:
    李开复给中国学生的第一封信
    vc++学习篇(三)——预处理命令之条件编译(#ifdef,#else,#endif,#if等)
    高级程序员考试时间安排和参考书推荐
    vc++学习篇(四)—— 指针
    程序员应具备的素质
    Word 2003 长篇文档排版技巧(二)
    Google 技巧集锦
    给中国学生的第二封信
    修复mysql表
    社保相关
  • 原文地址:https://www.cnblogs.com/yang-fei/p/5978036.html
Copyright © 2011-2022 走看看