<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ![](https://box.kancloud.cn/2016-03-18_56eb67c868925.jpg) 前文介紹過Silverlight Validation中兩個數據驗證機制,[ValidatesOnExceptions異常捕獲驗證機制](http://www.cnblogs.com/jv9/archive/2010/09/09/1821891.html)和[DataAnnotation驗證機制](http://www.cnblogs.com/jv9/archive/2010/09/10/1822910.html),這兩種驗證機制,是在Silverlight 3 Validation Framework推出的,其運行方式類似,都是當異常拋出后,應用對異常信息進行捕獲,并顯示在客戶端。在Silverlight 4中,Silverlight Validation有相對的改進,本篇將介紹Silverlight 4中新加入的驗證機制功能,IDataErrorInfo客戶端同步驗證機制。 **Silverlight 4 IDataErrorInfo接口概述** 相信熟悉WPF的開發人員都知道,WPF也具有IdataErrorInfo接口,其接口可以無需拋出任何異常,即可對數據進行驗證。而Silverlight的IDataErrorInfo接口就是從WPF中轉化來的。與前面兩種驗證機制相比,Silverlight 4 IDataErrorInfo提供的同步驗證方式,不再需要基于異常拋出的基礎上來激活驗證,簡單的理解,就是當值驗證失敗的時候,不會拋出任何異常信息。這種驗證機制,相對前兩種驗證機制來說更加靈活。 **Silverlight 4 IDataErrorInfo接口類成員** [IDataErrorInfo接口](http://msdn.microsoft.com/en-us/library/system.componentmodel.idataerrorinfo.aspx),位于System.ComponentModel命名空間。該接口主要被應用在需要對其進行驗證的數據成員類。 ![](https://box.kancloud.cn/2015-11-02_56374111ddec5.gif) ![](https://box.kancloud.cn/2016-02-17_56c4396b79c3e.gif) 代碼 ~~~ ??????????#region?IDataErrorInfo?Members ??????????public?string?Error ??????????{ ??????????????get?{?throw?new?NotImplementedException();?} ??????????} ??????????public?string?this[string?columnName] ?9?????????{ ?????????????get?{?throw?new?NotImplementedException();?} ????????} ?????????#endregion ~~~ IDataErrorInfo接口具有兩個**屬性**: 1. Error: 該屬性為驗證設置屬性錯誤提示信息; 2. Item: 該屬性為錯誤信息集合,其中索引值為屬性名,將其對應的錯誤信息,設置到指定的被驗證控件中; 從MSDN對IdataErrorInfo接口的解釋中可以看到,IDataErrorInfo接口,沒有任何事件方法被預先定義。也就是說,IDataErrorInfo接口本身不具備自動激活驗證功能。簡單的可以理解成為,當驗證錯誤產生時,該錯誤信息不會自動捕獲,然后顯示到用戶客戶端上。解決該問題,需要引入另外一個接口[INotifyPropertyChanged](http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx)。對Silverlight早期版本熟悉的開發人員,應該對[INotifyPropertyChanged](http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx)接口并不陌生,該接口主要功能是當數據成員改變時發出通知到客戶端,是Silverlight中最常用的一個接口,這里對該接口不再贅述。 ~~~ public?class?Customer??:?INotifyPropertyChanged ????public?event?PropertyChangedEventHandler?PropertyChanged; ????private?void?NotifyPropertyChanged(String?info) ????{ ????????if?(PropertyChanged?!=?null) ????????{ ????????????PropertyChanged(this,?new?PropertyChangedEventArgs(info)); ????????} ????} ????public?string?CustomerName ????{ ????????get ????????{ ????????????return?this.customerNameValue; ????????} ????????set ????????{ ????????????if?(value?!=?this.customerNameValue) ????????????{ ????????????????this.customerNameValue?=?value; ????????????????NotifyPropertyChanged("CustomerName"); ????????????} ????????} ????} ~~~ 在使用了[INotifyPropertyChanged](http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx)接口后,每當數據成員驗證錯誤產生時,都會執行IDataErrorInfo接口,檢測Error和Item屬性。但是僅僅使用[INotifyPropertyChanged](http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx)接口,還無法正常將錯誤信息顯示在客戶端,同時也需要在客戶端添加新的綁定驗證屬性[ValidatesOnDataErrors](http://msdn.microsoft.com/en-us/library/system.windows.data.binding.validatesondataerrors.aspx), 該屬性在默認綁定情況下是False,如果使用IDataErrorInfo接口,則需要使用True,這時,客戶端才會顯示IDataErrorInfo接口被執行后產生的驗證錯誤信息。 <TextBox?Text="{Binding?CustomerName,Mode=TwoWay,ValidatesOnDataErrors=true}"?/> 講到這里,我們可以結合前兩篇講解的綁定驗證屬性,來理解IDataErrorInfo接口。 使用IDataErrorInfo接口,必須結合INotifyPropertyChanged接口使用,否則UI無法獲取到相對應屬性的錯誤關聯信息。 而使用IDataErrorInfo接口綁定驗證屬性時,在客戶端控件內容綁定中使用ValidatesOnDataErrors = True, 另外,如果需要使用BindingValidationError事件,在客戶端控件內容中,需要再綁定NotifyOnValidationError = True, 如果需要對異常進行捕獲相應,同時,也需要綁定ValidatesOnExceptions = True。 **IDataErrorInfo接口使用實例演示** 本實例仍舊使用上一篇的實例代碼,在其基礎上添加對IDataErrorInfo接口的調用, 首先在User數據成員類中,執行IDataErrorInfo和INotifyPropertyChanged接口 ~~~ ???????#region?IDataErrorInfo?Members ????????private?string?_dataError?=?string.Empty; ????????public?string?Error ????????{ ????????????get?{?return?_dataError;?} ????????} ????????private?Dictionary<string,?string>?_dataErrors?=?new?Dictionary<string,?string>(); ????????public?string?this[string?columnName] ????????{ ????????????get? ????????????{ ????????????????if?(_dataErrors.ContainsKey(columnName)) ????????????????????return?_dataErrors[columnName]; ????????????????else ????????????????????return?null; ????????????} ????????} ????????#endregion ????????#region?INotifyPropertyChanged?Members ????????public?event?PropertyChangedEventHandler?PropertyChanged; ????????protected?void?NotifyPropertyChanged(string?propertyName) ????????{ ????????????if?(PropertyChanged?!=?null) ????????????????PropertyChanged(this,?new?PropertyChangedEventArgs(propertyName)); ????????} ????????#endregion ~~~ 其中IDataErrorInfo中定義的Dictionary是驗證錯誤集合。而INotifyPropertyChanged是最簡單的當數據成員改變時返回通知到客戶端,其中沒有過多的邏輯代碼。 我們使用最簡單的數據成員生成一個驗證錯誤,IDataErrorInfo捕獲顯示作為演示, ?在User類中,添加一個Address地址數據成員, ~~~ ????????private?string?_address; ????????public?string?address ????????{ ????????????get ????????????{ ????????????????return?_address; ????????????} ????????????set ????????????{ ????????????????_address?=?value; ????????????} ????????} ~~~ 然后在set中添加簡單的邏輯代碼, ~~~ ????????private?string?_address; ????????public?string?address ????????{ ????????????get ????????????{ ????????????????return?_address; ????????????} ????????????set ????????????{ ????????????????if?(string.IsNullOrEmpty(value)) ????????????????????_dataErrors["address"]?=?"地址必須填寫"; ????????????????else?if?(value.Trim().Length?<?6) ????????????????????_dataErrors["address"]?=?"地址至少6個字"; ????????????????else ????????????????????if?(_dataErrors.ContainsKey("address")) ????????????????????????_dataErrors.Remove("address"); ????????????????_address?=?value; ????????????????NotifyPropertyChanged("address"); ????????????} ????????} ~~~ 修改前臺,添加新的輸入框,另外綁定輸入框內容到address, ~~~ <StackPanel?Orientation="Horizontal"?Margin="5"> ????????????????<TextBlock?Text="地???址:?"?VerticalAlignment="Center"/> ????????????????<TextBox?x:Name="txtAddress"?Width="200"?DataContext="{Binding?Source={StaticResource?UserDataContext}}"?Text="{Binding?Path=address,?Mode=TwoWay,?ValidatesOnDataErrors=True}"?/> </StackPanel> ~~~ 其運行結果為: ![](https://box.kancloud.cn/2016-03-18_56eb67cd73e9d.jpg) ![](https://box.kancloud.cn/2016-03-18_56eb67cd826ed.jpg) 下面,我們做一個較為復雜一些的數據驗證, 學生成績對應表 A?? -??90-100分 B?? -? 80-89分 C?? -? 70-79分 D?? -? 60-69分 F???-? 0-59分 在這個實例中,我們對多個數據成員進行客戶端數據驗證。 添加兩個新數據成員,gradelevel和graderange,其中使用獨立的驗證函數ValidateGradeLevelandRange進行數據驗證, ~~~ ????????private?string?_gradelevel; ????????public?string?gradelevel ????????{ ????????????get?{?return?_gradelevel;?} ????????????set ????????????{ ????????????????if?(ValidateGradeLevelandRange(value,graderange)) ????????????????{ ????????????????????_gradelevel?=?value; ????????????????????NotifyPropertyChanged("gradelevel"); ????????????????} ????????????} ????????} ????????private?decimal?_graderange; ????????public?decimal?graderange ????????{ ????????????get?{?return?_graderange;?} ????????????set ????????????{ ????????????????if?(ValidateGradeLevelandRange(gradelevel,?value)) ????????????????{ ????????????????????_graderange?=?value; ????????????????????NotifyPropertyChanged("graderange"); ????????????????} ????????????} ????????} ~~~ ~~~ #region?Customize?Validation ????????private?bool?ValidateGradeLevelandRange(string?level,?decimal?range) ????????{ ????????????bool?isValid?=?false; ????????????if?(level?==?null) ????????????{ ????????????????_dataErrors["gradelevel"]?=?"成績等級必須是A,B,C,D,F"; ????????????????return?false; ????????????} ????????????else ????????????{ ????????????????switch?(level.ToUpper()) ????????????????{ ????????????????????case?"A": ????????????????????????isValid?=?(range?>=?90?&&?range?<=?100); ????????????????????????break; ????????????????????case?"B": ????????????????????????isValid?=?(range?>=?80?&&?range?<=?89); ????????????????????????break; ????????????????????case?"C": ????????????????????????isValid?=?(range?>=?70?&&?range?<=?79); ????????????????????????break; ????????????????????case?"D": ????????????????????????isValid?=?(range?>=?60?&&?range?<=?69); ????????????????????????break; ????????????????????case?"F": ????????????????????????isValid?=?(range?>=?0?&&?range?<=?59); ????????????????????????break; ????????????????????default: ????????????????????????_dataErrors["gradelevel"]?=?"成績等級必須是A,B,C,D,F"; ????????????????????????return?false; ????????????????} ????????????} ????????????if?(isValid) ????????????{ ????????????????if?(_dataErrors.ContainsKey("gradelevel")) ????????????????????_dataErrors.Remove("gradelevel"); ????????????????if?(_dataErrors.ContainsKey("graderange")) ????????????????????_dataErrors.Remove("graderange"); ????????????} ????????????else ????????????{ ????????????????_dataErrors["gradelevel"]?=?"成績等級和成績范圍不符合"; ????????????????_dataErrors["graderange"]?=?"成績范圍和成績等級不符合"; ????????????} ????????????return?isValid; ????????} ????????#endregion ~~~ 在前臺添加兩個成績輸入框, ~~~~ ????????????<StackPanel?Orientation="Horizontal"?Margin="5"> ????????????????<TextBlock?Text="成績等級:?"?VerticalAlignment="Center"/> ????????????????<TextBox?x:Name="txtGradeLevel"?Width="200"?DataContext="{Binding?Source={StaticResource?UserDataContext}}"?Text="{Binding?Path=gradelevel,?Mode=TwoWay,?ValidatesOnDataErrors=True,?NotifyOnValidationError=False,?ValidatesOnExceptions=True}"?/> ????????????</StackPanel> ????????????<StackPanel?Orientation="Horizontal"?Margin="5"> ????????????????<TextBlock?Text="成績范圍:?"?VerticalAlignment="Center"/> ????????????????<TextBox?x:Name="txtGradeRange"?Width="200"?DataContext="{Binding?Source={StaticResource?UserDataContext}}"?Text="{Binding?Path=graderange,?Mode=TwoWay,?ValidatesOnDataErrors=True,?NotifyOnValidationError=False,?ValidatesOnExceptions=True}"?/> ????????????</StackPanel> ~~~ 其最終運行結果如下: ![](https://box.kancloud.cn/2016-03-18_56eb67cd90d76.jpg) 今天內容講到這里了。 [源代碼下載](http://silverlightchina.net/uploads/soft/100913/1_1645248331.rar) 歡迎大家加入"專注Silverlight" 技術討論群: 32679955(六群) 23413513(五群) 32679922(四群) 100844510(三群) 37891947(二群) 22308706(一群) ? ?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看