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

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

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

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

數(shù)據(jù)校驗

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

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

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

ValidationRule的Validate方法返回一個ValidationResult對象,如果校驗通過,則ValidationResult的IsValid為true,否則為false。RangeValidationRule主要校驗用戶輸入數(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)于校驗規(guī)則,有以下幾點需要注意:

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

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

3. 輸出校驗信息

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

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ù)校驗示例演示

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

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

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

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

Binding的Converter屬性是IValueConverter類型,所以定義轉(zhuǎn)換器需要實現(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接口共兩個方法,其中Convert方法當(dāng)Source到Target時調(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時,調(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ù)校驗和類型轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)WPF Binding內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    C#?RichTextBox制作文本編輯器

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

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

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

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

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

最新評論

岚皋县| 莱州市| 酒泉市| 长兴县| 于田县| 会同县| 右玉县| 民和| 元氏县| 尼玛县| 大埔县| 四平市| 河西区| 皋兰县| 视频| 新郑市| 临泽县| 长兴县| 高淳县| 湖口县| 长垣县| 德保县| 中超| 灵丘县| 潮安县| 义马市| 灯塔市| 达拉特旗| 磐安县| 阳城县| 蒙自县| 冕宁县| 宜都市| 汾西县| 民丰县| 登封市| 辉南县| 玛曲县| 锦州市| 枣阳市| 开远市|