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

淺析WPF中Binding的數(shù)據(jù)校驗(yàn)和類型轉(zhuǎn)換

 更新時(shí)間:2024年03月05日 09:10:10   作者:老碼識(shí)途  
在WPF開發(fā)中,Binding實(shí)現(xiàn)了數(shù)據(jù)在Source和Target之間的傳遞和流通,那在WPF開發(fā)中,如何實(shí)現(xiàn)數(shù)據(jù)的校驗(yàn)和類型轉(zhuǎn)換呢,下面就跟隨小編一起學(xué)習(xí)一下吧

在WPF開發(fā)中,Binding實(shí)現(xiàn)了數(shù)據(jù)在Source和Target之間的傳遞和流通,就像現(xiàn)實(shí)生活中的一條條道路,建立起了城鎮(zhèn)與城鎮(zhèn)之間的銜接,而數(shù)據(jù)校驗(yàn)和類型轉(zhuǎn)換,就像高速公路之間的收費(fèi)站和安檢站。那在WPF開發(fā)中,如何實(shí)現(xiàn)數(shù)據(jù)的校驗(yàn)和類型轉(zhuǎn)換呢?本文以一個(gè)簡單的小例子,簡述在WPF開發(fā)中,實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)和類型轉(zhuǎn)換的相關(guān)知識(shí)點(diǎn),僅供學(xué)習(xí)分享使用,如有不足之處,還請指正。

數(shù)據(jù)校驗(yàn)

在WPF開發(fā)中,校驗(yàn)數(shù)據(jù)的有效性,主要步驟如下:

1. 實(shí)現(xiàn)校驗(yàn)規(guī)則

Binding的ValidationRules是Collection<ValidationRule>類型,是一個(gè)校驗(yàn)規(guī)則列表,可以支持多重校驗(yàn)。而ValidationRule是一個(gè)抽象類,所有要實(shí)現(xiàn)業(yè)務(wù)規(guī)則校驗(yàn),就要繼承ValidationRule并實(shí)現(xiàn)抽象方法。

ValidationRule的Validate方法返回一個(gè)ValidationResult對象,如果校驗(yàn)通過,則ValidationResult的IsValid為true,否則為false。RangeValidationRule主要校驗(yàn)用戶輸入數(shù)據(jù)的范圍:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
 
namespace WpfApp4.DataValidate
{
    public class RangeValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            double d = 0;
            if(double.TryParse(value.ToString(),out d))
            {
                if(d>=0 && d <= 100)
                {
                    return new ValidationResult(true,null);
                }
            }
            return new ValidationResult(false, "數(shù)據(jù)必須在0~100之間");
        }
    }
}

2. 設(shè)置規(guī)則

要想應(yīng)用規(guī)則,首先需要引入規(guī)則對應(yīng)的命名空間:xmlns:v="clr-namespace:WpfApp4.DataValidate"

然后設(shè)置Binding的ValidationRules規(guī)則,如下所示:

<TextBlock Text="年齡" VerticalAlignment="Center"></TextBlock>
<TextBox x:Name="tbAge" Width="120" Height="25" Margin="10" Validation.Error="tbAge_Error" VerticalContentAlignment="Center">
	<TextBox.Text>
		<Binding Path="Age" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
			<Binding.ValidationRules>
				<v:RangeValidationRule ValidatesOnTargetUpdated="True"></v:RangeValidationRule>
			</Binding.ValidationRules>
		</Binding>
	</TextBox.Text>
</TextBox>
<TextBlock VerticalAlignment="Center" Text="{Binding DataError}" Foreground="Red"></TextBlock>

關(guān)于校驗(yàn)規(guī)則,有以下幾點(diǎn)需要注意:

默認(rèn)情況下,認(rèn)為Source的數(shù)據(jù)總是正確的,規(guī)則校驗(yàn)只有當(dāng)Target更新時(shí),才會(huì)生效,因?yàn)門arget多為用戶輸入;如果當(dāng)Source更新時(shí)也要生效,則需要配置ValidatesOnTargetUpdated為true。

默認(rèn)情況下,校驗(yàn)規(guī)則返回的錯(cuò)誤信息,是不會(huì)輸出到UI的,如果要輸出要UI,需要設(shè)置NotifyOnValidationError屬性為true。

3. 輸出校驗(yàn)信息

默認(rèn)情況下,校驗(yàn)信息不會(huì)輸出到UI,只是顯示用戶控件為紅色邊框,如果要輸出校驗(yàn)信息,除了設(shè)置NotifyOnValidationError屬性外,還要訂閱Validation.Error事件,并在事件中處理要顯示的錯(cuò)誤信息,如下所示:

private void tbAge_Error(object sender, ValidationErrorEventArgs e)
{
	this.viewModel.ValidationErrorCommand.Execute(e);
}

其中上述方法中的命令為ViewModel中定義,如下所示:

public class MainWindowViewModel : ObservableObject
{
	private int age;
 
	public int Age
	{
		get { return age; }
		set { SetProperty(ref age , value); }
	}
 
	private string dataError;
 
	public string DataError
	{
		get { return dataError; }
		set { SetProperty(ref dataError , value); }
	}
 
 
	private TextBox textBox;
 
	private ICommand winLoadedCommand;
 
	public ICommand WinLoadedCommand
	{
		get {
			if (winLoadedCommand == null)
			{
				winLoadedCommand = new RelayCommand<object>(WinLoaded);
			}
			return winLoadedCommand; }
	}
 
	private void WinLoaded(object sender)
	{
		if (sender != null)
		{
			var win = sender as MainWindow;
			this.textBox = win.tbAge;
		}
	}
 
 
 
	private ICommand validationErrorCommand;
 
	public ICommand ValidationErrorCommand
	{
		get {
			if (validationErrorCommand == null)
			{
				validationErrorCommand = new RelayCommand<object>(DisplayValidationError);
			}
			return validationErrorCommand; }
	}
 
	private void DisplayValidationError(object obj)
	{
		if (Validation.GetErrors(this.textBox).Count > 0)
		{
			this.DataError= Validation.GetErrors(this.textBox)[0].ErrorContent.ToString();
		}
		else
		{
			this.DataError = string.Empty;
		}
	}
 
}

4. 數(shù)據(jù)校驗(yàn)示例演示

經(jīng)過上述步驟,運(yùn)行程序,如下所示:

數(shù)據(jù)類型轉(zhuǎn)換

在數(shù)據(jù)綁定時(shí),如果Source端的數(shù)據(jù)類型和Target端的數(shù)據(jù)類型不一致時(shí),就需要用到數(shù)據(jù)類型轉(zhuǎn)換,如:true/false與顯示/隱藏之間的轉(zhuǎn)換等,要實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換,需要用到Binding的Converter屬性。步驟如下:

1. 定義轉(zhuǎn)換器

Binding的Converter屬性是IValueConverter類型,所以定義轉(zhuǎn)換器需要實(shí)現(xiàn)IValueConverter接口,如下所示:

namespace WpfApp4.DataConverter
{
    public class BoolToVisilityConverter : IValueConverter
    {
        /// <summary>
        /// Source 到 Target
        /// </summary>
        /// <param name="value"></param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns></returns>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var flag = bool.Parse(value.ToString());
            if(flag)
            {
                return Visibility.Visible;
            }
            else
            {
                return Visibility.Collapsed;
            }
        }
 
        /// <summary>
        /// Target到Source
        /// </summary>
        /// <param name="value"></param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns></returns>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var visibility = Visibility.Collapsed;
            if (Enum.TryParse<Visibility>(value.ToString(), out visibility))
            {
                if (visibility == Visibility.Collapsed)
                {
                    return false;
                }
                else if(visibility == Visibility.Visible)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
 
            return false;
        }
    }
}

注意:IValueConverter接口共兩個(gè)方法,其中Convert方法當(dāng)Source到Target時(shí)調(diào)用,ConvertBack方法則是反方向調(diào)用。

2. 定義資源

轉(zhuǎn)換器也是一種資源,要聲明資源,首先引入命名空間xmlns:c="clr-namespace:WpfApp4.DataConverter",如下所示:

<Window.Resources>
	<c:BoolToVisilityConverter x:Key="boolToVisility"></c:BoolToVisilityConverter>
</Window.Resources>

3. 調(diào)用類型轉(zhuǎn)換

在Binding時(shí),調(diào)用資源Visibility="{Binding ElementName=chk01, Path=IsChecked, Converter={StaticResource boolToVisility}}"。通過復(fù)選框的選擇與否,控制控件的顯示與隱藏,如下所示:

<StackPanel Orientation="Horizontal" Grid.Row="0">
	<CheckBox Content="顯示" x:Name="chk01"></CheckBox>
</StackPanel>
<StackPanel Orientation="Horizontal" Grid.Row="1" Visibility="{Binding ElementName=chk01, Path=IsChecked, Converter={StaticResource boolToVisility}}">
	<TextBlock Text="年齡" VerticalAlignment="Center"></TextBlock>
	<TextBox x:Name="tbAge" Width="120" Height="25" Margin="10" Validation.Error="tbAge_Error" VerticalContentAlignment="Center">
		<TextBox.Text>
			<Binding Path="Age" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
				<Binding.ValidationRules>
					<v:RangeValidationRule ValidatesOnTargetUpdated="True"></v:RangeValidationRule>
				</Binding.ValidationRules>
			</Binding>
		</TextBox.Text>
	</TextBox>
	<TextBlock VerticalAlignment="Center" Text="{Binding DataError}" Foreground="Red"></TextBlock>
</StackPanel>

4. 數(shù)據(jù)類型轉(zhuǎn)換示例演示

到此這篇關(guān)于淺析WPF中Binding的數(shù)據(jù)校驗(yàn)和類型轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)WPF Binding內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#中DataTable導(dǎo)出為HTML格式的方法

    C#中DataTable導(dǎo)出為HTML格式的方法

    在平時(shí)的開發(fā)中經(jīng)常會(huì)將DataTable數(shù)據(jù)轉(zhuǎn)化到頁面顯示、打印、導(dǎo)出等操作,下面這篇文章主要給大家介紹了C#中DataTable導(dǎo)出為HTML格式的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • C#實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出任一Word圖表的通用呈現(xiàn)方法

    C#實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出任一Word圖表的通用呈現(xiàn)方法

    應(yīng)人才測評產(chǎn)品的需求,導(dǎo)出測評報(bào)告是其中一個(gè)重要的環(huán)節(jié),報(bào)告的文件類型也多種多樣,其中WORD輸出也扮演了一個(gè)重要的角色,本文給大家介紹了C#實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出任一Word圖表的通用呈現(xiàn)方法及一些體會(huì),需要的朋友可以參考下
    2023-10-10
  • .NET的深復(fù)制方法(以C#語言為例)

    .NET的深復(fù)制方法(以C#語言為例)

    深復(fù)制需要將對象實(shí)例中字段引用的對象也進(jìn)行復(fù)制,在平時(shí)的編程工作中經(jīng)常要用到這種復(fù)制方式,下面以c#為例來演示一下方法。
    2016-10-10
  • C#?wpf利用附加屬性實(shí)現(xiàn)任意控件拖動(dòng)

    C#?wpf利用附加屬性實(shí)現(xiàn)任意控件拖動(dòng)

    這篇文章主要為大家詳細(xì)介紹了C#?WPF如何利用附加屬性對幾種拖動(dòng)方式進(jìn)行封裝,實(shí)現(xiàn)復(fù)用性,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • 用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名)

    用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名)

    這篇文章主要介紹了用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C#窗口實(shí)現(xiàn)定時(shí)關(guān)機(jī)系統(tǒng)

    C#窗口實(shí)現(xiàn)定時(shí)關(guān)機(jī)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C#窗口實(shí)現(xiàn)定時(shí)關(guān)機(jī)系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C#實(shí)現(xiàn)順序表(線性表)完整實(shí)例

    C#實(shí)現(xiàn)順序表(線性表)完整實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)順序表(線性表)的方法,結(jié)合完整實(shí)例形式分析了順序表的原理及C#相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-06-06
  • C#?RichTextBox制作文本編輯器

    C#?RichTextBox制作文本編輯器

    這篇文章主要為大家詳細(xì)介紹了C#?RichTextBox制作文本編輯器的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • C#判等對象是否相等的方法匯總

    C#判等對象是否相等的方法匯總

    這篇文章主要介紹了C#判等對象是否相等的方法匯總,非常實(shí)用,需要的朋友可以參考下
    2014-08-08
  • C#調(diào)用EXE文件實(shí)現(xiàn)傳參和獲取返回結(jié)果

    C#調(diào)用EXE文件實(shí)現(xiàn)傳參和獲取返回結(jié)果

    本文主要介紹了C#調(diào)用EXE文件實(shí)現(xiàn)傳參和獲取返回結(jié)果,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評論

奉化市| 万安县| 安泽县| 牡丹江市| 沁阳市| 白朗县| 天峨县| 沁水县| 平江县| 晋中市| 孝昌县| 邹城市| 鄂尔多斯市| 遵化市| 怀远县| 黑山县| 桂平市| 乌恰县| 常州市| 横峰县| 云南省| 深州市| 乌兰浩特市| 于都县| 扬中市| 确山县| SHOW| 金昌市| 邵阳市| 屏南县| 双峰县| 浮梁县| 益阳市| 分宜县| 格尔木市| 黑山县| 沙洋县| 镇安县| 福建省| 年辖:市辖区| 肥城市|