日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人黄色在线 | av之家在线| 日韩免费高清视频 | 国产色视频一区二区三区qq号 | 日本三级一区二区三区 | 青娱网电信一区电信二区电信三区 | 日韩精品视频在线 | 免费看特级毛片 | 成人深夜影院 | 亚色在线 | 91在线观看视频 | 亚洲经典一区二区三区 | 妞干网精品 | 97香蕉| 久久黄色免费视频 | 大地资源在线观看免费高清版粤语 | 午夜在线观看视频18 | 青草精品视频 | 久99热 | 制服丝袜一区二区三区 | 综合国产视频 | 乳色吐息在线看 | 国产成人无码精品久在线观看 | 免费国产区 | 寡妇激情做爰呻吟 | 一区二区三区视频免费在线观看 | 特黄特色特刺激免费播放 | 成人做爰www免费看视频网站 | av五月天在线 | 国产18禁黄网站免费观看 | 女人下部全棵看视频 | 国产资源在线免费观看 | 国产欧美视频一区 | 亚洲国产成人精品久久久 | 国产黄色录像片 | 摸大乳喷奶水www视频 | 妻色成人网 | 先锋影音av资源站 | 狠狠操狠狠 | 香蕉国产在线视频 | 91精品国产一区二区三区蜜臀 | 国产一区二区三区四区三区四 | 综合网视频| 中文字幕第九页 | 亚洲精品乱码久久久久久蜜桃欧美 | 强行糟蹋人妻hd中文字幕 | 69天堂 | 在线天堂中文 | 国产一区美女 | 麻豆污视频 | 亚州国产 | 好吊妞精品 | 亚洲成人中文 | 欧美色图第一页 | 毛片成人网| 亚洲a一区 | 日日骚视频 | 小少妇哺乳喂奶播放 | 亚洲综合色av | 超碰888| 久久久久女人精品毛片九一 | 污污小说在线观看 | 午夜激情视频在线播放 | www.天堂av.com | 中国美女囗交视频 | 伊人久久综合视频 | 51精品国产人成在线观看 | 麻豆91茄子在线观看 | 国产综合视频在线 | 七七色影院 | 少妇全黄性生交片 | 伊人中文网 | 激烈娇喘叫1v1高h糙汉 | 国产熟妇与子伦hd | 特级黄色片 | 久久日本精品字幕区二区 | 婷婷的五月 | 国产成人三级在线 | 在线国产欧美 | 国产传媒精品 | 肉色超薄丝袜脚交69xx | www.毛片com| 亚洲国产精品视频在线观看 | 少妇饥渴放荡91麻豆 | 日本黄网站色大片免费观看 | 野外做受又硬又粗又大视频√ | 日韩一级片av | 精品久久精品 | 九九九九热| 精品三级视频 | 99久久久精品免费观看国产 | 色悠悠久久综合 | 67194成人在线观看 | 国产福利小视频在线观看 | www网站在线免费观看 | 在线观看免费视频一区二区 | 69xx欧美| 日本黄色www| 91精品在线视频观看 |