亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

WPF中的ValidationRule實現(xiàn)參數(shù)綁定解決方案

 更新時間:2023年08月18日 09:10:57   作者:czwy  
在WPF中,默認情況下,DataContext是通過可視化樹來傳遞的,父元素的DataContext會自動傳遞給其子元素,以便子元素可以訪問父元素的數(shù)據(jù)對象,這篇文章主要介紹了WPF中的ValidationRule實現(xiàn)參數(shù)綁定解決方案,需要的朋友可以參考下

背景

應用開發(fā)過程中,常常會對用戶輸入內(nèi)容進行驗證,通常是基于類型、范圍、格式或者特定的要求進行驗證,以確保輸入符合預期。例如郵箱輸入框校驗輸入內(nèi)容是否符合郵箱格式。在WPF中,數(shù)據(jù)模型允許將ValidationRulesBinding對象關聯(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的原理還有待研究。

到此這篇關于WPF中的ValidationRule實現(xiàn)參數(shù)綁定解決方案的文章就介紹到這了,更多相關WPF ValidationRule參數(shù)綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c#使用windows服務更新站點地圖的詳細示例

    c#使用windows服務更新站點地圖的詳細示例

    這篇文章主要介紹了c#使用windows服務更新站點地圖的詳細示例,需要的朋友可以參考下
    2014-04-04
  • C#實現(xiàn)繪制面形圖表的方法詳解

    C#實現(xiàn)繪制面形圖表的方法詳解

    這篇文章主要介紹了C#實現(xiàn)繪制面形圖表的方法,對于C#初學者很好的掌握C#圖形繪制有一定的借鑒價值,需要的朋友可以參考下
    2014-07-07
  • C#實現(xiàn)軟件防破解和防調(diào)試的幾種有效措施

    C#實現(xiàn)軟件防破解和防調(diào)試的幾種有效措施

    軟件保護在現(xiàn)代應用程序開發(fā)中變得越來越重要,尤其是在面對軟件盜版、調(diào)試和破解等問題時,在C#開發(fā)中,雖然沒有完全防止破解的辦法,但通過采取一些有效的防護措施,可以顯著增加破解的難度并保護軟件的知識產(chǎn)權(quán),本篇文章將探討在C#中實現(xiàn)軟件防破解和防調(diào)試的幾種常見技術
    2025-03-03
  • C#實現(xiàn)簡易計算器功能(附源碼)

    C#實現(xiàn)簡易計算器功能(附源碼)

    這篇文章主要為大家詳細介紹了C#實現(xiàn)簡易計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 淺析c#范型中的特殊關鍵字where & default

    淺析c#范型中的特殊關鍵字where & default

    以下是對c#范型中的特殊關鍵字where和default進行了詳細的介紹,需要的朋友可以過來參考下
    2013-09-09
  • C#反射之基礎應用實例總結(jié)

    C#反射之基礎應用實例總結(jié)

    這篇文章主要介紹了C#反射之基礎應用實例總結(jié),包括了反射的基本原理與用法實例,需要的朋友可以參考下
    2014-10-10
  • C# 實現(xiàn)Zookeeper分布式鎖的參考示例

    C# 實現(xiàn)Zookeeper分布式鎖的參考示例

    Zookeeper分布式鎖的原理是巧妙的是使用了znode臨時節(jié)點的特點和監(jiān)聽(watcher)機制,監(jiān)聽機制很簡單,就是我們可以給znode添加一個監(jiān)聽器,當znode節(jié)點狀態(tài)發(fā)生改變時(如:數(shù)據(jù)內(nèi)容改變,節(jié)點被刪除),會通知到監(jiān)聽器。本文講解使用c#實現(xiàn)該功能
    2021-06-06
  • C#利用com操作excel釋放進程的解決方法

    C#利用com操作excel釋放進程的解決方法

    最近利用Microsoft.Office.Interop.Excel.Application讀取一個excel后,進程中一直存在excel,在網(wǎng)上找了一陣子,其中有幾個解決方案
    2013-03-03
  • C#設置子窗體在主窗體中居中顯示解決方案

    C#設置子窗體在主窗體中居中顯示解決方案

    接下來將介紹C#如何設置子窗體在主窗體中居中顯示,本文提供詳細的操作步驟,需要的朋友可以參考下
    2012-12-12
  • C# 特性AttributeUsage簡介與使用教程

    C# 特性AttributeUsage簡介與使用教程

    這篇文章主要介紹了C# 特性AttributeUsage簡介與使用教程,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05

最新評論