WPF自定義正則驗證控制項

2021-06-06 21:17:20 字數 2061 閱讀 9793

我在這裡介紹一種自定義控制項方式的正則驗證方法。業務背景不做詳細說明,這裡以技術背景為主。

思路:建立乙個控制項,使其具有文字框的特性外,還能就行正則驗證;

依據這個思路,來講解實現。

第一步:建立自定義控制項

因為要保留textbox所有特性,所以就繼承於textbox控制項即可

public class regextextbox : textbox 

}

第二步:需要新增正則驗證的資訊

那就需要在類中新增2個依賴屬性:正規表示式(用於驗證輸入),錯誤訊息(當驗證不通過時顯示的錯誤內容,不是必須的)

public class regextextbox : textbox
第三步:使控制項能觸發驗證

觸發驗證的時機一般是:窗體載入後和內容改變後

「窗體載入後」不夠準確,因為正則驗證的表示式可能是從server傳過來,控制項初始化後,查詢並應用控制項模板,而wpf中對於輸入錯誤都採用了trigger來觸發顯示,例如:

接下來是測試專案內容:

1.主介面,就用使用者註冊來演示,要求:使用者名稱至少5個字元(不能有空格),年齡必須在0-150之間

注意regextextbox控制項,增加了regex和errormessage屬性。

……

……

2.viewmodel內容,使用了通知屬性

public class mainwindowviewmodel : notificationobject 

set }}

private int _age;

/// /// _age

///

public int age

set }}

}

測試方式:

1.初始狀態:名字為空,驗證不通過,在名字文字框的提示內容中能顯示錯誤訊息

2.年齡輸入錯誤數字

3.年齡輸入其他字元

如果在驗證錯誤觸發器使用(validation.errors)[0].errorcontent時,當輸入正確時會在輸出視窗顯示內部錯誤system.windows.data error: 17 : cannot get 'item' value (type 'validationerror') from '(validation.errors)' (type 'readonlyobservablecollection`1'). bindingexpression:path=(0)[0].errorcontent; dataitem='regextextbox' (name=''); target element is 'regextextbox' (name=''); target property is 'tooltip' (type 'object') argumentoutofrangeexception:'system.argumentoutofrangeexception: 指定的引數已超出有效值的範圍。

但是可以使用(validation.errors).currentitem.errorcontent,就不能出現異常。

結束語:

有人問:花這麼大的精力寫乙個正則文字框有意義嗎?不是直接可以在xaml中使用正則驗證嗎?

回答:1.一般正則就是在文字框中,對隨意輸的內容進行驗證;

2.如果採用靜態xaml的話,需要的窗體初始化後給控制項的binding屬性新增驗證規則;

3.用xaml寫的正則驗證規則,比此複雜一點點。

當然,如果是開發乙個小軟體,就不需要這麼花精力寫自定義控制項;如果是乙個企業級專案,以後控制項一直要復用,並且可能還會增加很多特殊需求的話,還是建議使用自定義擴充套件控制項。

WPF自定義控制項(四) 自定義控制項

原文 wpf自定義控制項 四 自定義控制項 在實際工作中,wpf提供的控制項並不能完全滿足不同的設計需求。這時,需要我們設計自定義控制項。這裡lz總結一些自己的思路,特性如下 下面舉例說說在專案中我們經常用到調音台音量條,寫乙個自定義控制項模擬調音台音量條。自定義控制項singnallight,實現...

WPF控制項自定義事件

第一步 定義乙個委託,委託屬於乙個定義,是和類 介面類似的,通常放在外部 輕提示事件委託 public delegate void sendmessageeventhandle string text 第二步 定義乙個sendmessageeventhandle型別事件,事件屬於類的成員,所以要放在...

Wpf 自定義控制項 1

1.新建乙個wpf工程,在工程下面新建 乙個資料夾themes,在themes下新建兩個資源字典檔案generic.xaml和prettyseekbar.xaml generic.xaml resourcedictionary xmlns xmlns x resourcedictionary.mer...