国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

WPF --- TextBox的輸入校驗

這篇具有很好參考價值的文章主要介紹了WPF --- TextBox的輸入校驗。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

引言

在WPF應用程序開發(fā)中,數(shù)據(jù)校驗是確保用戶輸入數(shù)據(jù)的正確性和完整性的重要一環(huán)。

之前在做一些參數(shù)配置功能時,最是頭疼各種參數(shù)校驗,查閱一些資料后,我總結(jié)了數(shù)據(jù)校驗方式有兩種:

  • ValidationRule
  • IDataErrorInfo

接下來分別介紹這兩種校驗方式。

ValidationRule

ValidationRule 是一個抽象類,提供了抽象方法 Validate(), 它是WPF中用于數(shù)據(jù)驗證的一種機制,它可以在用戶輸入數(shù)據(jù)之前或之后執(zhí)行自定義的驗證邏輯。可以輕松地實現(xiàn)對數(shù)據(jù)的格式、范圍、邏輯等方面的驗證,并在驗證失敗時提供相應的反饋信息。

ValidationRule主要作用域在前端頁面上。

基本用法

首先創(chuàng)建一個 ValidationRule,我這里設定了兩個屬性 MaxVal、MinVal,然后在 Validate() 方法中判斷空、判斷大于上限或小于下限,然后在符合條件是,返回 ValidationResult,并給出錯誤提示:

public class IntegerValidationRule : ValidationRule
{
    public int MaxVal { get; set; }
    public int MinVal { get; set; }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        string text = value as string;

        if (!int.TryParse(text, out int result))
        {
            return new ValidationResult(false, "Text cannot be empty.");
        }

        if (result > MaxVal)
        {
            return new ValidationResult(false, "Value out of upper limit range.");
        }

        if (result < MinVal)
        {
            return new ValidationResult(false, "Value out of lower limit range.");
        }

        return ValidationResult.ValidResult;
    }
}

接下來創(chuàng)建有個測試使用的 ViewModel:

public class TestViewModel : INotifyPropertyChanged
{
    private TestViewModel() { }

    public static TestViewModel Instance { get; } = new TestViewModel();

    public event PropertyChangedEventHandler? PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private int testField1;
    /// <summary>
    /// 測試屬性1
    /// </summary>
    public int TestField1
    {
        get => testField1;
        set
        {
            testField1 = value;
            OnPropertyChanged(nameof(TestField1));
        }
    }

    private int testField2;
    /// <summary>
    /// 測試屬性2
    /// </summary>
    public int TestField2
    {
        get => testField2;
        set
        {
            testField2 = value;
            OnPropertyChanged(nameof(TestField2));
        }
    }
}


在測試之前,我們可以先看一下 Binding 的方法列表:

可以看到 ValidationRulesBinding 下的集合,這意味著 ValidationRule 是在 Binding 下使用且可以執(zhí)行多個校驗規(guī)則。校驗時按照順序依次校驗。

接下來我們創(chuàng)建一個WPF應用程序,在界面添加 TextBox,命名為”textbox1“,將文本綁定在 TestViewModelTestField1

且為Validation.ErrorTemplate 綁定一個模板,這里綁定了一個紅色的感嘆號。

然后為 TextBox 設置觸發(fā)器,當 Validation.HasErrortrue時,將 ToolTip 綁定校驗失敗的錯誤提示。

代碼如下:

<Window
    x:Class="WpfApp4.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfApp4"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="900"
    Height="450"
    mc:Ignorable="d">
    <Window.Resources>
        <ControlTemplate x:Key="ValidationTemplate">
            <DockPanel>
                <TextBlock
                    Margin="-10,0,0,0"
                    VerticalAlignment="Center"
                    FontSize="22"
                    Foreground="Red"
                    Text="!" />

            </DockPanel>
        </ControlTemplate>

        <Style TargetType="TextBox">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>
        <StackPanel Grid.Column="0">
            <TextBlock
                HorizontalAlignment="Center"
                FontSize="18"
                FontWeight="Bold"
                Text="Validation Demo" />
            <TextBox
                Name="textBox1"
                Height="30"
                Margin="10"
                FontSize="22"
                Validation.ErrorTemplate="{StaticResource ValidationTemplate}">
                <TextBox.Text>
                    <Binding Path="TestField1" UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <local:IntegerValidationRule
                                MaxVal="999"
                                MinVal="5" />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>

        </StackPanel>
    </Grid>
</Window>

最后在窗體后臺綁定 ViewModel:

public MainWindow()
{
    InitializeComponent();
    this.DataContext =  TestViewModel.Instance;
}

測試

  1. 為空時,出現(xiàn)紅色嘆號,ToolTip 提示 "Text cannot be empty."

  2. 小于下限時,出現(xiàn)紅色嘆號,ToolTip 提示 "Value out of lower limit range."

  3. 大于上限時,出現(xiàn)紅色嘆號,ToolTip 提示 "Value out of upper limit range."

IDataErrorInfo

IDataErrorInfo 是一個接口,Viewmodel 實現(xiàn)接口用于在后臺,提供數(shù)據(jù)驗證和錯誤信息。

IDataErrorInfo 主要作用域為后臺 ViewModel
該接口包含兩個成員:Errorthis[string columnName]。這兩個成員允許你在數(shù)據(jù)綁定時提供驗證錯誤信息。

基本用法

接下來,在程序里添加 TextBox,命名為”textbox2“,并添加一個 TextBlock 綁定 Error 展示在界面。

<StackPanel Grid.Column="1">
    <TextBlock
        HorizontalAlignment="Center"
        FontSize="18"
        FontWeight="Bold"
        Text="IDataErrorInfo Demo" />
    <TextBox
        Name="textBox2"
        Margin="10"
        VerticalAlignment="Center"
        FontSize="22"
        Text="{Binding TestField2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
     <TextBlock
         HorizontalAlignment="Center"
         FontSize="18"
         FontWeight="Bold"
         Foreground="Red"
         Text="{Binding Error, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>

后臺 TestViweModel 實現(xiàn) IDataErrorInfo,依舊是判斷上限值和下限值,此處不判斷空,是因為后臺 TestField2 類型是Int,為空時不會賦值,代碼如下:

public class TestViewModel : INotifyPropertyChanged, IDataErrorInfo
{
    //省略上文已有代碼..。
    
    private string error;
    public string Error
    {
        get => error;
        set
        {
            error = value; OnPropertyChanged(nameof(Error));
        }
    }
    public string this[string columnName]
    {
        get
        {
            switch (columnName)
            {
                case nameof(TestField2):
                    return CheckTestFild2();
                default:
                    return null;
            }
        }
    }

    public int MaxVal = 999;
    public int MinVal = 5;

    private string CheckTestFild2()
    {
        if (TestField2 > MaxVal)
        {
            Error = "Value out of upper limit range in viewmodel.";
        }
        else if (TestField2 < MinVal)
        {
            Error = "Value out of lower limit range  in viewmodel.";
        }
        else
        {
            Error = string.Empty;
        }
        
        return Error;
    }
}

測試

  1. 小于下限時,出現(xiàn)紅色文字提示,ToolTip 提示 "Value out of lower limit range in viewmodel."

  2. 大于上限時,出現(xiàn)紅色文字提示,ToolTip 提示 "Value out of upper limit range in viewmodel."

小結(jié)

以上兩種數(shù)據(jù)校驗(IDataErrorInfo、ValidationRule)的方式,均可以實現(xiàn)自定義數(shù)據(jù)校驗,例如對數(shù)據(jù)的格式、范圍、邏輯等方面的驗證,并在驗證失敗時提供相應的反饋信息。

ValidationRule適用于在界面做數(shù)據(jù)校驗,且可以定義多個校驗規(guī)則。

ValidationRule適用于在ViewModel做數(shù)據(jù)校驗,可以做一些無法在前端頁面做的事情,比如出現(xiàn)異常值是還原為默認值。

所以兩者既可以單獨使用,也可以組合使用,即使使用MVVM模式,依舊能夠優(yōu)雅的做數(shù)據(jù)校驗。文章來源地址http://www.zghlxwxcb.cn/news/detail-746668.html

到了這里,關(guān)于WPF --- TextBox的輸入校驗的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • WPF工控機textbox獲得焦點自動打開軟鍵盤

    WPF工控機textbox獲得焦點自動打開軟鍵盤

    1.通過nuget安裝 osklib.wpf? 2.在textbox getFoucs中敲入如下代碼即可實現(xiàn)獲得焦點彈出軟鍵盤 ?3.如果界面上的textbox比較,就直接在窗體事件中寫。注意第一句為判斷是否為textbox

    2024年02月10日
    瀏覽(13)
  • 微信小程序input輸入框校驗手機號輸入錯誤

    微信小程序input輸入框校驗手機號輸入錯誤

    inputtaskphone(e) { if(e.detail.value!=“”){ if (!(/^1[3456789]d{9}$/.test(e.detail.value))) { this.setData({ phonedisplay: true, placeholder: “”, “task.phone”:“” }) } } }, focus() { this.setData({ phonedisplay: false, placeholder: “請輸入聯(lián)系方式”, “task.phone”:“” }) }, data: { task: { phone: “” }, phonedisplay: false,

    2024年02月09日
    瀏覽(24)
  • Flutter中的Web應用程序開發(fā):構(gòu)建現(xiàn)代Web應用程序

    作者:禪與計算機程序設計藝術(shù) 作為人工智能專家,程序員和軟件架構(gòu)師,CTO,我今天將為大家分享有關(guān) Flutter 中 Web 應用程序開發(fā)的見解。在這篇文章中,我們將深入探討 Flutter Web 應用程序的開發(fā)過程、技術(shù)原理以及最佳實踐。 引言 隨著移動設備的普及,Web 應用程序在全

    2024年02月12日
    瀏覽(33)
  • 基礎篇_開發(fā)命令行程序(輸入輸出,類型、變量、運算符,條件語句,循環(huán)語句,方法,package與jar)

    基礎篇_開發(fā)命令行程序(輸入輸出,類型、變量、運算符,條件語句,循環(huán)語句,方法,package與jar)

    輸入的作用,就是由使用者告訴程序要操作的數(shù)據(jù) 例如,我要通過餓了么訂餐,你得告訴程序你要吃什么,送貨地址是什么吧 輸出的作用,就是由程序向使用者展現(xiàn)執(zhí)行的結(jié)果 還是訂餐的例子,程序向你展示騎手接單沒有,送到哪里了 將來輸入輸出來源會有多種,比如 a

    2024年01月17日
    瀏覽(26)
  • ASP.NET WebForm中在TextBox輸入框回車時會觸發(fā)其他事件,如何處理?

    ASP.NET WebForm中在TextBox輸入框回車時會觸發(fā)其他事件,如何處理?

    在ASP.NET WebForm中,在頁面中按鍵盤上的回車鍵,會自動觸發(fā)某些事件,但是這并不是我們想要的效果,我們可以設置將其取消,那如何處理呢? 前臺代碼: ? 后臺在Page_Load中設置代碼: ?代碼示例: ? ? 在ASP.NET WebForm中,在頁面中按鍵盤上的回車鍵,需要自定義設置觸發(fā)某

    2024年02月15日
    瀏覽(21)
  • CoreDX DDS應用開發(fā)指南(5)開發(fā)發(fā)布應用程序

    ????????創(chuàng)建發(fā)布應用程序的步驟如下: 創(chuàng)建或獲取應用程序數(shù)據(jù)的DDL文件。 使用DDL編譯器編譯DDL文件。類型特定的支持和DataWriter是編譯DDL的結(jié)果。 編寫發(fā)布應用程序 編譯發(fā)布應用程序 ????????啟用DDS的應用程序本質(zhì)上是以數(shù)據(jù)為中心data-centric的。為了使這些以數(shù)

    2024年02月08日
    瀏覽(22)
  • Linux驅(qū)動開發(fā)—最詳細應用程序調(diào)用驅(qū)動程序解析

    Linux驅(qū)動開發(fā)—最詳細應用程序調(diào)用驅(qū)動程序解析

    Linux下進行驅(qū)動開發(fā),完全將驅(qū)動程序與應用程序隔開,中間通過 C標準庫函數(shù) 以及 系統(tǒng)調(diào)用 完成驅(qū)動層和應用層的數(shù)據(jù)交換。 驅(qū)動加載成功以后會在“/dev”目錄下生成一個相應的文件,應用程序通過 對“/dev/xxx” (xxx 是具體的驅(qū)動文件名字) 的文件進行相應的操作 即可實

    2024年02月16日
    瀏覽(25)
  • windows驅(qū)動開發(fā)7:應用程序和驅(qū)動程序的通信

    windows驅(qū)動開發(fā)7:應用程序和驅(qū)動程序的通信

    一、基礎介紹 1.1 設備與驅(qū)動的關(guān)系 設備由驅(qū)動去創(chuàng)建,訪問一個設備,是首先得訪問驅(qū)動。如果驅(qū)動在卸載的時候沒有刪除符號,r3下也是不能去訪問設備的。 驅(qū)動程序和系統(tǒng)其他組件之間的交互是通過給設備發(fā)送或者接受發(fā)給設備的請求來交互的。換句話說,一個沒有任

    2023年04月08日
    瀏覽(27)
  • C#程序設計——Windows應用程序開發(fā),1、初步掌握Windows應用程序的設計方法。2、掌握常用窗體控件的使用方法。

    C#程序設計——Windows應用程序開發(fā),1、初步掌握Windows應用程序的設計方法。2、掌握常用窗體控件的使用方法。

    初步掌握Windows應用程序的設計方法。 掌握常用窗體控件的使用方法。 1、設計一個Windows應用程序,創(chuàng)建一個用于添加學生個人基本信息的窗體,窗體下方法同時滾動信息“天行健,君子以自強不息!”。 ? 要示如下: 如圖1所示,設計窗體界面控件的布局 圖1 學生信息管理

    2024年02月10日
    瀏覽(39)
  • Linux應用程序開發(fā)經(jīng)驗

    1.1 熟練掌握命令行環(huán)境 ? 要學會Linux編程,必須得先學會用Linux,也就是要在Linux命令行環(huán)境下“生存”下來 ? 給一臺主機,能夠在上面裝一個操作系統(tǒng)(比如Ubuntu18.04或者其他版本) ? 給一臺Linux服務器,能夠熟練地用起來 ? 或者在Win10下,熟練使用WSL2 ? 安裝WSL2 ? 基

    2024年02月07日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包