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

如何讓WPF中的ValidationRule實現(xiàn)參數(shù)綁定

這篇具有很好參考價值的文章主要介紹了如何讓WPF中的ValidationRule實現(xiàn)參數(shù)綁定。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

應用開發(fā)過程中,常常會對用戶輸入內(nèi)容進行驗證,通常是基于類型、范圍、格式或者特定的要求進行驗證,以確保輸入符合預期。例如郵箱輸入框校驗輸入內(nèi)容是否符合郵箱格式。在WPF中,數(shù)據(jù)模型允許將ValidationRulesBinding對象關(guān)聯(lián),可以通過繼承ValidationRule類并重寫Validate方法來創(chuàng)建自定義規(guī)則。

問題

盡管創(chuàng)建自定義校驗規(guī)則可以滿足大部分應用場景,但是當我們校驗規(guī)則是動態(tài)變化的時候就有些麻煩了。例如,開發(fā)一個文件管理系統(tǒng),要求文件名不能與系統(tǒng)中已有的文件重名。這個時候需要先獲取到系統(tǒng)中已有文件的名稱列表,并綁定到ValidationRule上。然而ValidationRule不是繼承于DepedencyObject,不能添加依賴屬性,自定義的驗證規(guī)則中的參數(shù)不支持綁定。

解決方案

接下來將給出一個解決方案,讓ValidationRule支持參數(shù)綁定。思路如下:
首先自定義一個繼承DepedencyObject的類ValidationParams,并在其中添加依賴屬性用于綁定數(shù)據(jù)。

public class ValidationParams:DependencyObject
{
    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(ValidationParams), new PropertyMetadata(null));
}

然后在自定義校驗規(guī)則FileNameValidationRule中添加ValidationParams類型的屬性。

public class FileNameValidationRule : ValidationRule
{
    public ValidationParams Params { get; set; }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        Regex reg = new Regex("[^()()a-zA-Z0-9_\u4e00-\u9fa5]");
        if (reg.IsMatch(value.ToString()) || value.ToString().Trim() == "")
            return new ValidationResult(false, "請輸入字母、數(shù)字、下劃線或漢字");
        else if ((Params.Data as List<string>).Contains(value.ToString()))
            return new ValidationResult(false, "名稱重復,請修改名稱");
        else
            return new ValidationResult(true, null);
    }
}

最后在XAML中輸入框數(shù)據(jù)綁定時添加校驗規(guī)則,并把已有文件的名稱列表綁定到校驗規(guī)則參數(shù)中。

<ctoolkit:WatermarkTextBox x:Name="FileNameWTextBox" Watermark="請輸入文件名稱" ShowClearButton="True" Width="418" Height="30" HorizontalAlignment="Left" Margin="90,0,0,0">
    <TextBox.Text>
        <Binding Path="FileName" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <chelper:FileNameValidationRule>
                    <chelper:FileNameValidationRule.Params>
                        <chelper:ValidationParams Data="{Binding DataContext.ListFileName,ElementName=self}"/>
                    </chelper:FileNameValidationRule.Params>
                </chelper:FileNameValidationRule>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</ctoolkit:WatermarkTextBox>

然而,事情并沒有那么順利,ValidationParams的Data始終是空的,也就是綁定不成功。這是為什么呢?經(jīng)過研究發(fā)現(xiàn),F(xiàn)ileNameValidationRule并不在可視化樹上,無法繼承和訪問到DataContext,因此綁定失敗。

解決這個問題的方法也不太復雜(其實找解決辦法也是花了點時間)。思路是利用資源字典和Freezable類。

  • 即使不在邏輯樹中的對象也可以通過key訪問到資源。
  • Freezable類的主要目的是定義具有可修改狀態(tài)和只讀狀態(tài)的對象,但是比較幸運的是這個類的實例不在可視化樹或邏輯樹中也可以繼承到DataContext,目前我也不清楚這里的原理。

根據(jù)這兩點信息,首先定義一個繼承于Freezable的類BindingProxy,包含一個用于綁定數(shù)據(jù)的依賴屬性DataProperty。

public class BindingProxy : Freezable
{
    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new PropertyMetadata(null));
}

然后在WatermarkTextBox的資源字典中實例化BindingProxy,并綁定已有文件名稱列表,然后在校驗規(guī)則參數(shù)ValidationParams的Data中綁定BindingProxy實例。

<ctoolkit:WatermarkTextBox x:Name="FileNameWTextBox" Watermark="請輸入文件名稱" ShowClearButton="True" Width="418" Height="30" HorizontalAlignment="Left" Margin="90,0,0,0">
    <ctoolkit:WatermarkTextBox.Resources>
        <chelper:BindingProxy x:Key="FileNamesProxy" Data="{Binding DataContext.ListFileName,ElementName=self}"/>
    </ctoolkit:WatermarkTextBox.Resources>
    //上文中已有代碼此處省略...
    <chelper:ValidationParams Data="{Binding Source={StaticResource FileNamesProxy},Path=Data}"/>
    //上文中已有代碼此處省略...
</ctoolkit:WatermarkTextBox>

小結(jié)

在WPF中,默認情況下,DataContext是通過可視化樹來傳遞的。父元素的DataContext會自動傳遞給其子元素,以便子元素可以訪問父元素的數(shù)據(jù)對象。但是,不在可視化樹上的對象,無法繼承和直接綁定到DataContext。本文的案例也是在這個地方卡殼了,雖然最終解決了這個問題,但是Freezable類如何繼承到DataContext的原理還有待研究。文章來源地址http://www.zghlxwxcb.cn/news/detail-654730.html

到了這里,關(guān)于如何讓WPF中的ValidationRule實現(xiàn)參數(shù)綁定的文章就介紹完了。如果您還想了解更多內(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)文章

  • 關(guān)于微信小程序中的數(shù)據(jù)雙向綁定如何實現(xiàn)

    關(guān)于微信小程序中的數(shù)據(jù)雙向綁定如何實現(xiàn)

    前言 官方文檔:微信小程序雙向綁定語法 在 WXML 中,普通的屬性的綁定是單向的。例如: 如果使用 this.setData({ value: ‘leaf’ }) 來更新 value ,this.data.value 和輸入框的中顯示的值都會被更新為 leaf ;但如果用戶修改了輸入框里的值,卻不會同時改變 this.data.value 。 如果需要在

    2024年02月05日
    瀏覽(18)
  • 【wpf】xaml 中的參數(shù)復用

    【wpf】xaml 中的參數(shù)復用

    xaml中有幾種復用的方式: 有時在xaml中,我們需要復用一些參數(shù),比如 固定的一個值。 有時是固定的一個樣式。 有時多個控件都要設置一個高度,我可以引入sys 我就使用這個吧: xmlns:sys=\\\"clr-namespace:System;assembly=mscorlib\\\" 用的更多的其實是margin,我們試一試: 這里 mm 用的是

    2024年02月07日
    瀏覽(25)
  • F#奇妙游(14):F#實現(xiàn)WPF的綁定

    F#奇妙游(14):F#實現(xiàn)WPF的綁定

    綁定在UI開發(fā)中是一個非常重要的概念,它可以讓我們的UI界面和數(shù)據(jù)模型之間建立起聯(lián)系,當數(shù)據(jù)模型發(fā)生變化時,UI界面也會隨之變化,反之亦然。這樣的好處是顯而易見的,我們不需要手動去更新UI界面,而是讓數(shù)據(jù)模型自己去更新UI界面,這樣的代碼更加簡潔,更加易于

    2024年02月16日
    瀏覽(12)
  • 【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

    【.NET6+WPF】WPF使用prism框架+Unity IOC容器實現(xiàn)MVVM雙向綁定和依賴注入

    前言:在C/S架構(gòu)上,WPF無疑已經(jīng)是“桌面一霸”了。在.NET生態(tài)環(huán)境中,很多小伙伴還在使用Winform開發(fā)C/S架構(gòu)的桌面應用。但是WPF也有很多年的歷史了,并且基于MVVM的開發(fā)模式,受到了很多開發(fā)者的喜愛。 并且隨著工業(yè)化的進展,以及幾年前微軟對.NET平臺的開源,國內(nèi)大多

    2024年02月06日
    瀏覽(28)
  • WPF實現(xiàn)更加靈活綁定復雜Command(使用Microsoft XAML Behaviors 庫)

    WPF實現(xiàn)更加靈活綁定復雜Command(使用Microsoft XAML Behaviors 庫)

    1、安裝NuGet ???????? 2、在XAML的命名空間引入: 3、使用(這里是設置了一個Canvas的點擊事件,其它面板也是類似這樣設置): ? ? ? ? --我這里的ViewModel部分是這樣子的 4、這樣就可以在ViewModel中直接給這個Command內(nèi)容了,不用像之前那么麻煩地綁定Command了,這樣更加清晰,

    2024年02月04日
    瀏覽(28)
  • cocos creator 如何綁定參數(shù)到編輯器

    cocos creator 如何綁定參數(shù)到編輯器

    很多cocos?creator同學不知道如何綁定組件屬性到編輯器上,今天我們來教大家如何綁定 1: 基本數(shù)據(jù)屬性綁定到編輯器 ???這個非常簡單,模板是屬性名字:?默認的值; Is_debug: false, speed: 100, 2: 系統(tǒng)組件類型與節(jié)點綁定到編輯器 屬性名字:?{ ???type: 組件類型(cc.Sprite, cc.Label,

    2024年01月23日
    瀏覽(24)
  • 工控視覺項目桌面端WPF源碼,UI源碼,已實現(xiàn)前后端MVVM數(shù)據(jù)綁定

    工控視覺項目桌面端WPF源碼,UI源碼,已實現(xiàn)前后端MVVM數(shù)據(jù)綁定

    工控視覺項目桌面端WPF源碼,UI源碼,已實現(xiàn)前后端MVVM數(shù)據(jù)綁定。 除了兩個柱狀圖用的第三方開源控件,其他都是原生自己寫的,非常適合初學者熟悉語法、事件、觸發(fā)器、MVVM 機制、布局容器,方便二次開發(fā)和修改 工控視覺項目桌面端WPF源碼,UI源碼,已實現(xiàn)前后端MVVM數(shù)據(jù)

    2024年02月20日
    瀏覽(21)
  • 首頁搜索框傳遞參數(shù),并在搜索頁面中的搜索框中進行顯示,搜索框綁定回車鍵進行搜索

    首頁搜索框傳遞參數(shù),并在搜索頁面中的搜索框中進行顯示,搜索框綁定回車鍵進行搜索

    1.寫出搜索條件和搜索框 2.添加scss樣式 頁面 3.搜索框選擇條件,在搜索框中輸入內(nèi)容,然后進行頁面跳轉(zhuǎn) 在搜索框中輸入內(nèi)容,然后進行頁面跳轉(zhuǎn) 4.頁面跳轉(zhuǎn)后從地址欄中獲取相關(guān)數(shù)據(jù),搜索條件和搜索框中的內(nèi)容 從地址欄中獲取到相關(guān)數(shù)據(jù)searchText和selectSearch的值

    2024年02月10日
    瀏覽(36)
  • wpf數(shù)據(jù)綁定之元素、資源、后臺綁定

    wpf數(shù)據(jù)綁定之元素、資源、后臺綁定

    ? ? ? ? wpf前端的數(shù)據(jù)綁定主要分為元素、資源以及后臺數(shù)據(jù)三種,元素可以簡單的理解為前端的空間數(shù)據(jù)綁定,資源是在resource里找數(shù)據(jù),而后臺就是跟cs文件之間的數(shù)據(jù)互相傳遞。 ? ? ? ? ? 先說下元素吧,也就是控件元素,因為代碼比較簡單,就不上效果了,自己可以

    2024年02月04日
    瀏覽(17)
  • WPF——事件綁定命令

    WPF——事件綁定命令

    我們都知道WPF中的命令在結(jié)合MVVM模式的框架使用之后(框架重新實現(xiàn)了ICommand),可以解耦。但并不是所有控件都可以綁定命令的,比如TextBox、ComboBox等。在使用這類控件時,如果你想讓它的某個事件激發(fā)時調(diào)用ViewModel中的方法,往往需要把ViewModel中的方法暴露給View,然后在

    2024年02月05日
    瀏覽(95)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包