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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

wpf验证方案讨论

發(fā)布時間:2025/7/14 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 wpf验证方案讨论 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??????雖然wpf內(nèi)部有驗證方案,但在實際應(yīng)用中,會出現(xiàn)一些問題.這里發(fā)出來與大家共同討論.作為使用者,你喜歡哪一種呢?這里不解釋數(shù)據(jù)綁定的知識,因為不夠?qū)I(yè),怕會誤導(dǎo),索性不寫.但我相信大家會遇到這個問題.本文是通過多個示例比較得出的想法.

1.通過繼承ValidationRule抽象類,定義驗證規(guī)則重寫Validate方法

這里是sdk的示例代碼

Code
public?class?AgeRangeRule?:?ValidationRule
????
{
????????
private?int?_min;
????????
private?int?_max;

????????
public?AgeRangeRule()
????????
{
????????}


????????
public?int?Min
????????
{
????????????
get?{?return?_min;?}
????????????
set?{?_min?=?value;?}
????????}


????????
public?int?Max
????????
{
????????????
get?{?return?_max;?}
????????????
set?{?_max?=?value;?}
????????}


????????
public?override?ValidationResult?Validate(object?value,?CultureInfo?cultureInfo)
????????
{
????????????
int?age?=?0;

????????????
try
????????????
{
????????????????
if?(((string)value).Length?>?0)
????????????????????age?
=?Int32.Parse((String)value);
????????????}

????????????
catch?(Exception?e)
????????????
{
????????????????
return?new?ValidationResult(false,?"Illegal?characters?or?"?+?e.Message);
????????????}


????????????
if?((age?<?Min)?||?(age?>?Max))
????????????
{
????????????????
return?new?ValidationResult(false,
??????????????????
"Please?enter?an?age?in?the?range:?"?+?Min?+?"?-?"?+?Max?+?".");
????????????}

????????????
else
????????????
{
????????????????
return?new?ValidationResult(true,?null);
????????????}

????????}

????}

然后是xaml的使用代碼

????<TextBox?Name="textBox1"?Width="50"?FontSize="15"
?????????????Validation.ErrorTemplate
="{StaticResource?validationTemplate}"
?????????????Style
="{StaticResource?textBoxInError}"
?????????????Grid.Row
="1"?Grid.Column="1"?Margin="2">
??????
<TextBox.Text>
????????
<Binding?Path="Age"?Source="{StaticResource?ods}"
?????????????????UpdateSourceTrigger
="PropertyChanged"?>
??????????
<Binding.ValidationRules>
????????????
<c:AgeRangeRule?Min="21"?Max="130"/>
??????????
</Binding.ValidationRules>
????????
</Binding>
??????
</TextBox.Text>
????
</TextBox>
就是通過ValidationRules集合掛驗證規(guī)則.如果邏輯不復(fù)雜的話,勉強可以接受,這里我個人認(rèn)為可以作為界面的驗證.但如果業(yè)務(wù)邏輯一旦發(fā)生變化,則意味著xaml文件一直需要修改,這并不是一種好的做法,并不推薦.(而且內(nèi)置的驗證規(guī)則太少了,有的話還勉強用用,都需要自己重寫)

2.通過正則表達(dá)式附加屬性簡化寫法,大家應(yīng)該知道,驗證部分,正則表達(dá)式占了很大部分.

定義一個正則表達(dá)式類,然后通過附加屬性進(jìn)行驗證.具體的方案,請參考這里
http://www.codeproject.com/WPF/RegexValidationInWPF.asp
然后前端xaml的使用方法
????<TextBox
??????
Text="{Binding?Path=EmailAddress,?UpdateSourceTrigger=PropertyChanged}"?
??????jas:RegexValidator.RegexText
="^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$"?
??????jas:RegexValidator.ErrorMessage
="Invalid?e-mail?address."?
??????
/>
代碼是簡化了,但有個缺點,只能定義一個驗證規(guī)則,也存在著我上面提到的問題,把正則寫在ui上面,并不是一個好的做法,應(yīng)該對其進(jìn)行封裝(看著這么多符號就心慌,高手可以這么做),也并不推薦的做法.

3.與業(yè)務(wù)邏輯驗證綁定在一起
這種做法與上面的都不同,因為業(yè)務(wù)邏輯的判斷與常規(guī)的判斷比如(比如是否必填,字符匹配等),而且前端只需要綁定字段就可以了,先看前端的做法
<TextBox?Width="100"?Grid.Column="1"?HorizontalAlignment="Left"?Margin="5,5,0,5"?x:Name="txtFirstName"?Text="{Binding?Path=FirstName,?Mode=TwoWay,?UpdateSourceTrigger=LostFocus,?ValidatesOnDataErrors=True}"?ToolTip="Enter?customers?first?name."?/>
請注意,這里并沒有寫什么驗證規(guī)則或正則表達(dá)式哦,真正的驗證在這里,驗證的對象必須實現(xiàn)IDataErrorInfo接口,通過索引器,可以判斷對象的每個字段.
上面緊緊是FirstName,這里是通過整個對象的業(yè)務(wù)邏輯判斷的,否則你需要在ui上面都定義一個驗證規(guī)則,非常麻煩(比如有2個字段,你必須對兩個字段都定義驗證規(guī)則(即第一種方法)).這種做法是比較好的,把邏輯與ui分開了,值得推薦.sdk示例代碼
?public?class?Person?:?IDataErrorInfo
????
{
????????
private?int?age;

????????
public?int?Age
????????
{
????????????
get?{?return?age;?}
????????????
set?{?age?=?value;?}
????????}


????????
public?string?Error
????????
{
????????????
get
????????????
{
????????????????
return?null;
????????????}

????????}


????????
public?string?this[string?name]
????????
{
????????????
get
????????????
{
????????????????
string?result?=?null;

????????????????
if?(name?==?"Age")
????????????????
{
????????????????????
if?(this.age?<?0?||?this.age?>?150)
????????????????????
{
????????????????????????result?
=?"Age?must?not?be?less?than?0?or?greater?than?150.";
????????????????????}

????????????????}

????????????????
return?result;
????????????}

????????}

????}


但還有些問題,如果我在第3點的基礎(chǔ)上,我還要加一個普通的判斷,比如必填驗證,長度驗證,還是逃不了驗證規(guī)則這一步.
這里我們要做出選擇
把規(guī)則定義在ui上(變動太大,不適合,無奈之舉)
寫在業(yè)務(wù)邏輯里面(這樣下來,邏輯未免太復(fù)雜)

4.以元數(shù)據(jù)的形式(在屬性上掛標(biāo)簽)

codeproject上,我找到一個比較完美的解決方案,作者自己重新定義了一套標(biāo)簽,使用也比較簡單(代碼是vb的,編譯后再反編譯用c#看:)),這種做法已經(jīng)接近了要求.大家去看看這篇文章,非常的不錯.其在還為前端提供了一個ui顯示錯誤的一個下拉列表.不過通過這個例子,我又想到一個更好的東西.

5.使用EnterPrise Library Validation Application Block(再好不過)
由于wpf的屬性使用了大量的依賴屬性,我原以為這個好東西在wpf算是廢了,通過第3點和第4點,我們終于可以引進(jìn)這個企業(yè)級模塊了。如下做法
Code
????public?abstract?class?BaseValidationEntity<T>?:?IDataErrorInfo,?INotifyPropertyChanged
????
{
????????
IDataErrorInfo?Members#region?IDataErrorInfo?Members

????????
public?string?Error
????????
{
????????????
get?{?return?null;?}
????????}


????????
private?T?_entity;

????????
public?bool?Valid()
????????
{
????????????Validator
<T>?validator?=?ValidationFactory.CreateValidator<T>();
????????????ValidationResults?results?
=?validator.Validate(this);
????????????
return?results.Count?==?0;
????????}


????????
public?string?this[string?name]
????????
{
????????????
get
????????????
{
????????????????
????????????????
string?result?=?null;
????????????????
????????????????Validator
<T>?validator?=?ValidationFactory.CreateValidator<T>();
????????????????ValidationResults?results?
=?validator.Validate(this);
????????????????
if?(results.Count?>?0)
????????????????
{
????????????????????
return?results.First().Message;
????????????????????
//foreach?(var?item?in?results)
????????????????????
//{
????????????????????
//????result?+=?item.Message;
????????????????????
//}
????????????????}


????????????????
return?result;
????????????}

????????}


????????
#endregion


????????
protected?void?OnPropertyChanged(string?name)
????????
{
????????????PropertyChangedEventHandler?handler?
=?PropertyChanged;
????????????
if?(handler?!=?null)
????????????
{
????????????????handler(
this,?new?PropertyChangedEventArgs(name));
????????????}

????????}



????????
INotifyPropertyChanged?Members#region?INotifyPropertyChanged?Members

????????
public?event?PropertyChangedEventHandler?PropertyChanged;

????????
#endregion

????}

然后繼承之,隨便定一個對象來demo
???public?class?aa:BaseValidationEntity<aa>
????
{
????????
private?string?firstName;

????????[StringLengthValidator(
4,?10,MessageTemplate="aaa")]
????????[RegexValidator(
@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*",?MessageTemplate?=?"Invalid?e-mail?address")]
????????
public?string?FirstName
????????
{
????????????
get?{?return?firstName;?}
????????????
set?{?firstName?=?value;
????????????OnPropertyChanged(
"FirstName");
????????????}

????????}

????}

我們看到熟悉的標(biāo)簽了,目前我認(rèn)為這種方案最好,當(dāng)然我們也可以通過配置xml來實現(xiàn),這樣真正做到了界面與邏輯分離。

上面一層的做到了邏輯上的驗證,至于界面如何顯示錯誤,我們可以通過Error屬性來定制一個控件,這個暫不討論了

在學(xué)習(xí)wpf的朋友,歡迎一起討論。

?參考文章
http://blogs.msdn.com/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx

轉(zhuǎn)載于:https://www.cnblogs.com/Clingingboy/archive/2008/06/23/wpfvalidation.html

總結(jié)

以上是生活随笔為你收集整理的wpf验证方案讨论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本黄在线 | 善良的少妇伦理bd中字 | 欧美色交 | 久久高清无码视频 | 日本爽爽爽 | 毛片天天看 | 日韩69| 国产伦精品一区二区三区免.费 | 91在线免费网站 | 丝袜调教91porn | 欧美高清一区二区三区四区 | 香蕉久久国产av一区二区 | 林雅儿欧洲留学恋爱日记在线 | 欧美日韩www| 黄色大毛片 | 99热首页| 欧美日本一二三区 | 国语精品 | 国产精品久久久久久久久免费相片 | 老司机午夜免费视频 | 少妇愉情理伦片bd | 成人午夜天 | 成人在线免费播放视频 | 精品亚洲精品 | 色播放 | 国产香蕉视频 | 色图一区 | 麻豆精品视频 | 亚洲成人高清在线观看 | 日日噜噜噜| 欧美少妇bbw | 国产女人18毛片水真多18精品 | 亚洲天天视频 | 欧美高清一区二区 | 久久久久毛片 | 青青草色视频 | 欧洲女女同videos | 日本一级黄色大片 | 欧美片网站免费 | 日本视频免费在线 | 在线看欧美 | 国产精品一二三区在线观看 | 鬼眼 电影| 天堂网www在线 | 亚洲 激情| 色诱久久av| 亚洲一区二区三区四区五区午夜 | 欧美a网| 91一区在线| 日日爽视频 | 日韩国产欧美视频 | 亚洲熟女一区二区 | 日韩一区免费视频 | 国产福利合集 | 美女隐私无遮挡免费 | 国产二区视频在线观看 | 国产又粗又大又爽视频 | 波多野结衣av一区二区全免费观看 | 免费国产在线观看 | 成人首页 | 午夜视频日韩 | 黄色美女视频网站 | 国产情侣第一页 | 免费黄色网址在线观看 | 亚洲高清免费观看 | 欧美毛片视频 | 欧美亚洲综合一区 | 亚洲国产精品久久久久婷婷老年 | 青娱乐免费在线视频 | 葵司有码中文字幕二三区 | 国产精品一区二区三区免费观看 | 大尺度舌吻呻吟声 | 麻豆91在线观看 | 亚洲精品资源在线 | 亚洲国产欧美日韩 | 亚洲蜜桃精久久久久久久久久久久 | 男人干女人视频 | 成人在线视频免费观看 | 99久久毛片 | 污污的网站在线免费观看 | 中文字幕日韩亚洲 | 欧美sm极限捆绑bd | 色婷婷在线观看视频 | 欧美极品jizzhd欧美爆 | 日本一本久草 | 国产三级高清 | 国产乱淫视频 | 蜜臀尤物一区二区三区直播 | 国产精品视频你懂的 | 夜色一区二区三区 | 国偷自产av一区二区三区 | 国产毛片久久 | 六月激情网 | 成人宗合 | 国产色99 | 美日韩一区二区 | 久久99久久99精品免视看婷婷 | 麻豆黄色网址 | 亚洲欧美一区二区三区久久 |