日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

【WPF】数据验证

發布時間:2023/12/19 综合教程 21 生活家
生活随笔 收集整理的這篇文章主要介紹了 【WPF】数据验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

數據驗證在任何用戶界面程序中都是不可缺少的一部分.在WPF中,數據驗證更是和綁定緊緊聯系在一起,下面簡單介紹MVVM模式下常用的幾種驗證方式.

錯誤信息顯示

在介紹數據驗證之前,有必要介紹一下如何顯示錯誤信息.方式很簡單,定義一個樣式觸發器,將錯誤信息和ToolTip綁定,如下:

           <Style TargetType="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>

ValidatesOnExceptions驗證規則

ValidatesOnExceptions是WPF預定義的驗證規則,它會捕捉任何位置上的異常,包括類型轉換異常,屬性設置器異常,值轉換器異常等.捕捉到異常的時候,輸入的邊框會變成紅色,當然也可以自定義錯誤的模板(Validation.ErrorTemplate).想要ValidatesOnExceptions生效,將綁定屬性中的ValidatesOnExceptions設置為true即可.

PS:無論設置為true或false,類型轉換異常總會發生的,也就是總會有紅色框.

數據對象中驗證

直接在數據對象中編寫驗證規則是最簡單粗暴的方式,如下

        public int Price
        {

            get { return _price; }
            set
            {
                if (Equals(value, _price)) return;

                if (value < 0)
                {

                    throw new ArgumentException("數值不能小于0");

                }
                else
                {
                    _price = value;
                    RaisePropertyChanged(() => Price);
                }
            }
        }

如果小于0,程序不會拋錯,文字提示也會顯示在ToolTip上,前提是ValidatesOnExceptions=true.

PS:這種方式能如期實現,是因為WPF的Binding 捕捉屬性設置中的所有異常.但是,如果是代碼設置負數的話,程序直接掛掉.

自定義驗證規則

除了WPF預定義的驗證規則外,我們還可以自定義驗證規則,要繼承ValidationRule,編寫驗證不能大于99的數值,代碼如下:

    public class NumberRule : ValidationRule
    {
        public override System.Windows.Controls.ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            int i;
            //  int.TryParse(value.ToString(), out i);
            if (!int.TryParse(value.ToString(), out i))
            {
                return new System.Windows.Controls.ValidationResult(false,
                       "字符串格式不對!");
            }
            if (i > 99)
            {
                return new System.Windows.Controls.ValidationResult(false,
                        "數值不能大于99!");
            }
            else
            {
                return new System.Windows.Controls.ValidationResult(true, null);
            }

        }
    }
       <TextBox  Height="25" Width="100" Margin="208,142,0,0"  VerticalAlignment="Top" HorizontalAlignment="Left" >
            <TextBox.Text>
                <Binding Path="Price" Mode="TwoWay" ValidatesOnDataErrors="True">  
                    <Binding.ValidationRules>
                        <ExceptionValidationRule></ExceptionValidationRule>
                        <local:NumberRule></local:NumberRule>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>           
        </TextBox>

PS:自定義驗證規則總是在ExceptionValidationRule之前進行,所以要在NumberRule加上轉換類型的異常處理,不然會有拋錯的可能性,當然上面的代碼中如果有類型錯誤變量i總會返回0.

PS:驗證的執行順序:自定義驗證規則->值轉換器->ExceptionValidationRule->數據對象驗證.

ValidatesOnDataErrors驗證規則

正常情況下,上面的幾種方式都可以工作得很好,但是屬性多達幾十個的時候,寫起來就不是那么的舒服了.這個時候我們可以通過繼承接口IDataErrorInfo來將我們的驗證規則統一起來,代碼如下:

        public string Error
        { get { return ""; } }

        public string this[string propertyname]
        {
            get
            {
                string result = null;
                if (propertyname == "Price")
                {
                    if (Price >99)
                    {
                        result = "數值不能大于99!!";
                    }
                }
                return result;
            }
        }
Error在WPF中沒作用,返回任意都可以.
PS:記得把ValidatesOnDataErrors=true
PS:驗證的執行順序:自定義驗證規則->值轉換器->ExceptionValidationRule->數據對象驗證->ValidatesOnDataErrors.

進階ValidatesOnDataErrors驗證規則
ValidatesOnDataErrors雖然能統一起來到一個地方,但是還免不了每一個屬性單獨寫一個規則.所以我們需要一個更簡便的方式,那就是DataAnnotations+IDataErrorInfo的方式,代碼如下:
        private int _price;
        [Range(0, 99, ErrorMessage = "數值要在0到99之間")]
        public int Price
        {

            get { return _price; }
            set
            {
                if (Equals(value, _price)) return;

                if (value < 0)
                {

                    throw new ArgumentException("數值不能小于0");

                }
                else
                {
                    _price = value;
                    RaisePropertyChanged(() => Price);
                }
            }
        }

        public string this[string propertyname]
        {
            get
            {
                var vc = new ValidationContext(this, null, null);
                vc.MemberName = propertyname;
                var res = new List<System.ComponentModel.DataAnnotations.ValidationResult>();

                var result = Validator.TryValidateProperty(this.GetType().GetProperty(propertyname).GetValue(this, null), vc, res);
                if (res.Count > 0)
                {
                    return string.Join(Environment.NewLine, res.Select(r => r.ErrorMessage).ToArray());
                }
                return string.Empty;
            }
        }

采用這種方式,開發的時候只需要簡單的設置一下特性,就能如期望的顯示我們的驗證提示了,關于這種方式的詳細用法,網上有一篇更好的文章:傳送門.

注意事項

到這里,如果沒有什么意外,相信大家都會采用DataAnnotations+IDataErrorInfo的方式,這種方式實現最簡單,而且發生在viewmodel上,我們很容易地在保存環節得到所有異常信息,從而阻止保存數據的進行.但是WPF的數據驗證中都有個通病,就是發生數據異常的時候,屬性實際的值還是上次合法的值,和界面上顯示的值有所不同.這個時候如果用戶強行保存,我們就發現DataAnnotations+IDataErrorInfo的驗證方式竟然通過了!這不符合我們的期望.這種情況我沒發現有什么優雅的解決方案,暫時想到的只有在按鈕的點擊事件中遍歷LogicalTreeHelper的輸入控件,檢查Validation.HasError屬性,組合異常信息傳給viewmodel,讓viewmodel作出處理.其實最為徹底的方式是,封裝數字輸入控件等各類特定的控件,提高用戶體驗的同時,也讓異常處理更簡單.

小結

本文簡單介紹了WPF數據驗證的各種方式,而我們基本上都會采用DataAnnotations+IDataErrorInfo的方式,如果您有更好的方式,請不吝指教,感激不盡!

總結

以上是生活随笔為你收集整理的【WPF】数据验证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 爱爱视频网站 | 韩毛片 | 激情视频在线免费观看 | 国产精品久久久 | 殴美一级视频 | 国产页 | 欧美一级乱黄 | 伊人成长网 | 精品免费视频一区二区 | 99re视频这里只有精品 | 国产精品一区二区三区四区视频 | 成年人视频免费 | 国产高清免费观看 | 在线不欧美 | 日韩中文字幕视频 | 久操网站 | 黄网在线免费观看 | av资源中文在线 | 亚洲欧美中日韩 | 亚洲国产精品成人综合久久久 | 九九久久综合 | 欧美做爰xxxⅹ性欧美大片 | 天天躁日日躁狠狠躁 | 欧美日韩六区 | 99久久久无码国产精品免费麻豆 | 久久久天天 | 久久久成人精品一区二区三区 | 天天操天天射天天舔 | 99这里 | 国产精品福利小视频 | 亚洲最大成人网色 | 欧av在线 | 国产91在线 | 亚洲 | 国产一级理论 | 天堂亚洲网 | 性做久久 | 日韩无马 | 精品无码人妻少妇久久久久久 | 精品成人无码一区二区三区 | 夜夜操影院 | 亚洲精品xxx| 国产色播av在线 | 久久这里只有精品国产 | 性欧美大战久久久久久久久 | 黄色成人av | 国产大片黄 | 久草视频免费 | 91视频直接看 | 欧美aⅴ视频 | 欧美啊v | 欧美顶级少妇做爰 | 日本韩国毛片 | www.五月.com| 男人与雌性宠物交啪啪 | 日韩h在线| 2024国产精品 | 爱欲av | 亚洲精品456 | 一道本在线观看视频 | 美女张开腿让男人操 | 国产精品福利片 | 欧美成人日韩 | 精品欧美一区二区在线观看 | 成年人免费在线观看视频网站 | 少妇久久久 | 懂色av一区二区三区四区五区 | 三级黄色图片 | 国产做爰全过程免费视频 | jizzjizz在线观看 | 成人手机av| 国产色视频网站 | 福利亚洲 | 国产伦理在线 | 五月婷婷综合网 | 性色生活片 | 伊人涩涩 | 男女视频免费 | 99久久久国产 | 精品视频网 | 国产一区二区三区免费观看 | 在线观看香蕉视频 | 少妇性l交大片7724com | 久操免费视频 | 就去吻综合 | 调教一区二区三区 | 日韩精品一区二区亚洲av | 国产爱搞 | 99精品视频免费观看 | 日韩成人在线观看视频 | 国产精品又黄又爽又色无遮挡 | 一级做a爰 | 亚洲福利视频一区 | 国产电影一区二区三区爱妃记 | 麻豆国产一区二区三区 | 免费在线色视频 | 青青青操 | 99自拍| 91官网视频 | 精品福利三区3d卡通动漫 |