最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WPF使用ValidationRules對(duì)MVVM架構(gòu)數(shù)據(jù)驗(yàn)證

 更新時(shí)間:2022年01月28日 08:43:00   作者:痕跡g  
這篇文章介紹了WPF使用ValidationRules對(duì)MVVM架構(gòu)數(shù)據(jù)驗(yàn)證的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

對(duì)于WPF中的驗(yàn)證, View驗(yàn)證實(shí)現(xiàn)起來(lái)很簡(jiǎn)單, 可以通道 Validation.ErrorEvent 冒泡傳遞到View的邏輯樹(shù)上, 只是, 通常這樣做的情況下, 我們需要為View添加事件代碼監(jiān)聽(tīng)這類(lèi)錯(cuò)誤事件, 然后進(jìn)行處理。

這樣做可以說(shuō)是非常簡(jiǎn)單, 但是這樣的硬編碼的, 基本上每個(gè)模塊每個(gè)功能, 你都必不可少的為其進(jìn)行重復(fù)的工作, 這是一項(xiàng)非??菰锴覠o(wú)聊的體力活!

于是, 則考慮MVVM的架構(gòu)中, 如何把這種模式傳遞到ViewModel中, 使得前端的驗(yàn)證, 對(duì)于ViewModel仍然有效。

實(shí)現(xiàn)的原理, 如圖所示:

在此之前, 對(duì)于View前端驗(yàn)證需要做的一些操作步驟,

  • 1.為驗(yàn)證的屬性添加自定義驗(yàn)證類(lèi)
  • 2.設(shè)置驗(yàn)證錯(cuò)誤的通知屬性 NotifyOnValidationError="True" 。 注: 如此一來(lái), 則可以產(chǎn)生Validation.ErrorEvent事件
  • 3.通過(guò)自定義的 ValidationExceptionBehavior 繼承于 Behavior, 用于監(jiān)聽(tīng) Validation.ErrorEvent 的錯(cuò)誤事件。
  • 4.在 ValidationExceptionBehavior 中通過(guò) AssociatedObjectde的DataContex獲取到關(guān)聯(lián)當(dāng)前View的DataContex, 從而改變DataContext的后端驗(yàn)證條件。

1.設(shè)置屬性自定義的驗(yàn)證類(lèi)并添加 NotifyOnValidationError="True" 屬性

                        <TextBox  Margin="15 0 10 0" 
                                 Style="{StaticResource MaterialDesignFloatingHintTextBox}"  materialDesign:HintAssist.Hint="登錄名 *">
                            <TextBox.Text>
                                <Binding Path="Model.Account" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
                                    <Binding.ValidationRules>
                                        <domain:CustomizeValidationRule validationType="Str" 
                                                                        minLength="3" maxLength="10"
                                                                        errorMessage="輸入長(zhǎng)度范圍 [3-10]字" 
                                                                        ValidatesOnTargetUpdated="True" />
                                    </Binding.ValidationRules>
                                </Binding>
                            </TextBox.Text>
                        </TextBox>

2.自定義 IValidationExceptionHandler 接口, ViewModel繼承IValidationExceptionHandler , 用于接收前端的驗(yàn)證結(jié)果。

public interface IValidationExceptionHandler
    {
        /// <summary>
        /// 是否有效
        /// </summary>
        bool IsValid
        {
            get;
            set;
        }
    }

3. 自定義 ValidationExceptionBehavior, 用于監(jiān)聽(tīng)處理View的錯(cuò)誤事件

    /// <summary>
    /// 驗(yàn)證行為類(lèi),可以獲得附加到的對(duì)象
    /// </summary>
    public class ValidationExceptionBehavior : Behavior<FrameworkElement>
    {
        /// <summary>
        /// 錯(cuò)誤計(jì)數(shù)器
        /// </summary>
        private int _validationExceptionCount = 0;
        
        /// <summary>
        /// 附加對(duì)象時(shí)
        /// </summary>
        protected override void OnAttached()
        {
            //附加對(duì)象時(shí),給對(duì)象增加一個(gè)監(jiān)聽(tīng)驗(yàn)證錯(cuò)誤事件的能力,注意該事件是冒泡的
            this.AssociatedObject.AddHandler(Validation.ErrorEvent, new EventHandler<ValidationErrorEventArgs>(this.OnValidationError));
        }
        
        #region 獲取實(shí)現(xiàn)接口的對(duì)象

        /// <summary>
        /// 獲取對(duì)象
        /// </summary>
        /// <returns></returns>
        private IValidationExceptionHandler GetValidationExceptionHandler()
        {
            if (this.AssociatedObject.DataContext is IValidationExceptionHandler)
            {
                var handler = this.AssociatedObject.DataContext as IValidationExceptionHandler;

                return handler;
            }

            return null;
        }

        #endregion
        
        #region 驗(yàn)證事件方法

        /// <summary>
        /// 驗(yàn)證事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnValidationError(object sender, ValidationErrorEventArgs e)
        {
            try
            {
                var handler = GetValidationExceptionHandler();

                var element = e.OriginalSource as UIElement;

                if (handler == null || element == null)
                    return;

                if (e.Action == ValidationErrorEventAction.Added)
                {
                    _validationExceptionCount++;
                    
                }
                else if (e.Action == ValidationErrorEventAction.Removed)
                {
                    _validationExceptionCount--;
                }
                handler.IsValid = _validationExceptionCount == 0;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion
    }

4. View容器最外層注冊(cè)添加的監(jiān)聽(tīng)錯(cuò)誤事件 ValidationExceptionBehavior

   <i:Interaction.Behaviors>
        <domain:ValidationExceptionBehavior></domain:ValidationExceptionBehavior>
    </i:Interaction.Behaviors>

5. ViewModel 通過(guò)實(shí)現(xiàn) IValidationExceptionHandler 來(lái)獲取前端的驗(yàn)證結(jié)果

根據(jù)前端驗(yàn)證的結(jié)果, 正確保存, 錯(cuò)誤進(jìn)行提示

        public override void Save()
        {
            if (!this.IsValid)
            {
                MessageBox.Show("輸入的格式有誤,請(qǐng)重新輸入!");
                return;
            }
            base.Save();
        }

效果:

到此這篇關(guān)于WPF使用ValidationRules對(duì)MVVM架構(gòu)數(shù)據(jù)驗(yàn)證的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ASP.NET 中 Button、LinkButton和ImageButton 三種控件的使用詳解

    ASP.NET 中 Button、LinkButton和ImageButton 三種控件的使用詳解

    本文主要介紹Button、LinkButton和ImageButton 三種控件的使用方法,并一一舉例演示它們的用法,希望對(duì)大家有所幫助。
    2016-04-04
  • .NET Framework 4.5新特性介紹

    .NET Framework 4.5新特性介紹

    .NET Framework 4.5新特性介紹,想要使用新版本的朋友可以參考下
    2012-04-04
  • ASP.NET?Core中的Configuration配置二

    ASP.NET?Core中的Configuration配置二

    這篇文章介紹了ASP.NET?Core中的Configuration配置,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • ASP.NET中Image控件使用詳解

    ASP.NET中Image控件使用詳解

    本文詳細(xì)介紹了Image控件的使用方法,用實(shí)例演示了Image控件的用法,希望對(duì)大家有所幫助。
    2016-04-04
  • ASP.NET Core服務(wù)生命周期

    ASP.NET Core服務(wù)生命周期

    這篇文章介紹了ASP.NET Core中的服務(wù)生命周期,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • ASP.NET HttpRequest類(lèi)介紹

    ASP.NET HttpRequest類(lèi)介紹

    本文詳細(xì)講解了ASP.NET HttpRequest類(lèi),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • asp.net OleDbCommand 的用法

    asp.net OleDbCommand 的用法

    asp.net下OleDbCommand的使用代碼
    2008-04-04
  • .Net行為型設(shè)計(jì)模式之命令模式(Command)

    .Net行為型設(shè)計(jì)模式之命令模式(Command)

    這篇文章介紹了.Net行為型設(shè)計(jì)模式之命令模式(Command),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 使用vs2022在.net6中調(diào)試帶typescript的靜態(tài)頁(yè)面

    使用vs2022在.net6中調(diào)試帶typescript的靜態(tài)頁(yè)面

    這篇文章介紹了使用vs2022在.net6中調(diào)試帶typescript的靜態(tài)頁(yè)面,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • ASP.NET處理HTTP請(qǐng)求的流程:IHttpModule、IHttpHandler與管道事件

    ASP.NET處理HTTP請(qǐng)求的流程:IHttpModule、IHttpHandler與管道事件

    這篇文章介紹了ASP.NET處理HTTP請(qǐng)求的流程:IHttpModule、IHttpHandler與管道事件,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評(píng)論

株洲市| 印江| 伊宁县| 德钦县| 枣阳市| 武清区| 兖州市| 印江| 紫金县| 定州市| 桦川县| 安吉县| 东阳市| 余江县| 三穗县| 翁牛特旗| 通辽市| 泾源县| 张北县| 仪征市| 手机| 天气| 榆社县| 云龙县| 垫江县| 天全县| 开封市| 龙泉市| 庆城县| 贵阳市| 双鸭山市| 荥经县| 沂南县| 元朗区| 宜州市| 绥棱县| 云南省| 泸溪县| 黄浦区| 名山县| 东丽区|