欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

WPF快速入門教程之綁定Binding

 更新時間:2018年10月15日 11:03:03   作者:奇葩史  
初學(xué)wpf,經(jīng)常被Binding搞暈,以下記錄寫B(tài)inding的基礎(chǔ)。下面這篇文章主要給大家介紹了關(guān)于WPF快速入門教程之綁定Binding的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

綁定(Binding)元素介紹

首先,盜用張圖。這圖形象的說明了Binding的機(jī)理。

此處主要介紹的綁定類是System.Windows.Data.Binding,如果涉及其他內(nèi)容,將簡要介紹,不會過多說明。

下面將簡要介紹最基礎(chǔ)(最常用)的三個屬性:

1、Path —— 路徑,用于索引到具體的屬性,常常會省略書寫,示例如下:

<TextBox Text="{Binding Path=A.B}" />

其中Path=可以省略,因?yàn)锽inding元素含有一個帶參構(gòu)造函數(shù),其參數(shù)為path。另外,示例中A.B需具體到屬性,如果A已經(jīng)是需要綁定的具體屬性,則可以用A替換A.B。即最簡單的格式是:

 <TextBox Text="{Binding A}" />

2、Mode —— 模式,用于指定數(shù)據(jù)的更新方向,它是一個枚舉類型,共有一下四種方式:

  • OneTime —— 一次性更新(只更新一次),從數(shù)據(jù)源更新到當(dāng)前使用的綁定屬性。
  • OneWay —— 單向更新,從數(shù)據(jù)源更新到當(dāng)前使用的屬性。
  • OneWayToSource —— 單向更新,從當(dāng)前使用的屬性更新到數(shù)據(jù)源。
  • TwoWay —— 雙向更新,當(dāng)前屬性與數(shù)據(jù)源同步。

注:如果未指定,即表示使用默認(rèn)模式,而在不同的依賴屬性上,其模式是不一樣的。在使用時,如果不確定其默認(rèn)模式是否是自己需要的模式時,則可以手動指定。

3、UpdateSourceTrigger —— 數(shù)據(jù)源更新觸發(fā)器,用于指定控件上的屬性值什么時候更新到數(shù)據(jù)源,它也是個枚舉類型,有以下三種方式:

  • Explicit —— 顯示更新,需要調(diào)用UpdateSource方法后才能更新。
  • LostFocus —— 失去焦點(diǎn)更新
  • PropertyChanged —— 屬性值改變更新,大部分情況會使用此方式,但有時頻繁的更新數(shù)據(jù)源會降低效率,如在TextBox中,如果數(shù)據(jù)源有較多的數(shù)據(jù)驗(yàn)證,此時在輸入Text時,就有可能出現(xiàn)界面卡頓的情況。

注:當(dāng)然,此處也有默認(rèn)值設(shè)置,但不同的控件 屬性的 默認(rèn) 值也不一樣,不過大部分情況下默認(rèn) 值是PropertyChanged,比較特殊的有TextBox的Text屬性,其默認(rèn)值是LostFocus。

下面給一個最常用的綁定書寫方式:

<TextBox Text="{Binding A,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" />

控件綁定

控件綁定,即在同一個界面中不同控件之間的數(shù)據(jù)同步處理,最常見的就是滑動條與一個文本框之間的綁定。在控件綁定中,需要指定綁定類的ElementName屬性值,即當(dāng)前屬性綁定到哪一個控件的屬性上。示例如下:

<Slider Name="slider" Maximum="100" />
<TextBox Text="{Binding ElementName=slider,Path=Value,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" />

注:在WPF開發(fā)中,我們常常是不為控件設(shè)置Name值的,而在控件綁定中,必須為源控件添加Name屬性值;而有些控件可能會不含有Name屬性,此時則使用x:Name來指定名稱。

在控件綁定中有一個比較特殊的存在——模板綁定-TemplateBinding,它與Binding并不在一個繼承結(jié)構(gòu)上。TemplateBinding是用在控件模板定義中的,用于綁定模板對應(yīng)控件中的屬性,示例如下:

<TextBox x:Name="templatebinding">
 <TextBox.Template>
  <ControlTemplate TargetType="TextBox">
   <TextBlock Text="{TemplateBinding Text}" />
  </ControlTemplate>
 </TextBox.Template>
</TextBox>

TemplateBinding可以簡單理解為在Binding中設(shè)置了ElementName為其父級控件 —— 事實(shí)并非如此,僅作為輔助理解。TemplateBinding相對與Binding要少很多屬性內(nèi)容。

數(shù)據(jù)綁定

此處數(shù)據(jù)綁定表示在WPF中的對象綁定,即常見場景 就是把數(shù)據(jù)庫 數(shù)據(jù)顯示到 界面上。而在真實(shí)的項目開發(fā)中 ,常 會用到MVVM模式,數(shù)據(jù)綁定將會在那里體現(xiàn)出來,但MVVM模式開發(fā)則不在此節(jié)中敘述。

下面以一個最簡單的示例解釋數(shù)據(jù)綁定:

后臺類 —— 數(shù)據(jù)源結(jié)構(gòu):

class ForDataBinding
{
 public int Count { get; set; }
}

數(shù)據(jù)源初始化 —— 創(chuàng)建數(shù)據(jù)并將數(shù)據(jù)綁定到界面:

ForDataBinding data = new ForDataBinding();
data.Count = 10;
this.fordatabinding.DataContext = data;

界面控件設(shè)置 —— 指定控件綁定到源數(shù)據(jù)的哪個屬性:

<Grid x:Name="fordatabinding">
 <TextBox Text="{Binding Count}" />
</Grid>

其中設(shè)置了Grid的DataContext,即表示Grid內(nèi)部數(shù)據(jù)上下文是以設(shè)置的數(shù)據(jù)源為基礎(chǔ),在此示例中,Text屬性綁定的Count就是以ForDataBinding類對象為基礎(chǔ)查找屬性。 —— 即綁定路徑是以當(dāng)前位置以樹形結(jié)構(gòu)往下查找對應(yīng)屬性。

其他元素

Binding除了以上內(nèi)容,還有其他的屬性設(shè)置,本小節(jié)將簡要介紹幾個較為常用的內(nèi)容。

數(shù)據(jù)格式化轉(zhuǎn)換

在數(shù)據(jù)綁定中,有時我們需要顯示的數(shù)據(jù)與源數(shù)據(jù)不一樣,如時間格式,浮點(diǎn)數(shù)格式,或者更復(fù)雜一些的想要一個類對象中的多個屬性組合一起顯示。

對于簡單的數(shù)據(jù)格式化,可以通過StringFormat來處理,如時間格式化為yyyy-MM-dd,浮點(diǎn)數(shù)保留兩位小數(shù)等等。其代碼示例如下:

后臺類:

class SimpleDataConvert
{
 public DateTime Date { get; set; } = DateTime.Now;
 public float Price { get; set; } = 100.123456f;
}

使用:

this.simpleconvert.DataContext = new SimpleDataConvert();

界面處理:

<StackPanel x:Name="simpleconvert">
 <TextBox Text="{Binding Date,StringFormat=yyyy-MM/dd}" />
 <TextBlock Text="{Binding Price,StringFormat=f2}" />
</StackPanel>

上述示例結(jié)果就是將Date日期格式化為yyyy-MM/dd;將Price保留兩位小數(shù)顯示。

但是有些數(shù)據(jù)顯示要求無法通過StringFormat處理,則需要使用Binding的屬性Converter來處理了 —— 即通過值轉(zhuǎn)換器來處理。下面我們以上面用到的時間轉(zhuǎn)化為例,假如我們要在前臺顯示yyyyMMdd格式的日期,此時從數(shù)據(jù)源顯示到界面可以正確處理,但是在界面輸入,它無法正確轉(zhuǎn)化為源數(shù)據(jù),即內(nèi)置的Converter不支持,此時我們就需要自己實(shí)現(xiàn)值轉(zhuǎn)換,示例 如下:

首先定義DateConverter,實(shí)現(xiàn)接口IValueConverter,代碼如下:

class DateConverter : IValueConverter
{
 /// <summary>
 /// 數(shù)據(jù)源轉(zhuǎn)界面顯示
 /// </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)
 {
  if (value.GetType() == typeof(System.DateTime))
  {
   return ((System.DateTime)value).ToString("yyyyMMdd");
  }
  else
  {
   return value;
  }
 }

 /// <summary>
 /// 界面顯示轉(zhuǎn)數(shù)據(jù)源
 /// </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)
 {
  if (targetType == typeof(System.DateTime) && value != null)
  {
   DateTime dt = DateTime.Now;
   string valuestr = value.ToString();
   if (DateTime.TryParse(valuestr, out dt))
   {
    return dt;
   }
   else if (valuestr.Length == 8)
   {
    string yearstr = valuestr.Substring(0, 4);
    string monthstr = valuestr.Substring(4, 2);
    string daystr = valuestr.Substring(6, 2);
    if (DateTime.TryParse(string.Format("{0}-{1}-{2}", yearstr, monthstr, daystr), out dt))
    {
     return dt;
    }
   }
  }
  return value;
 }
}

然后在Xaml文件中添加引用:

由于此處DateConvert直接定義在當(dāng)前窗體類命名空間下,所以其已經(jīng)默認(rèn)添加了如下空間,如果定義在其他位置,則需要手動添加空間引用。

xmlns:local="clr-namespace:Binding_Demo"

資源定義,以便于在控件中引用

<Window.Resources>
 <local:DateConverter x:Key="dateconvert" />
</Window.Resources>

最后,則將值轉(zhuǎn)換器應(yīng)用到控件上,代碼如下:

<TextBox Text="{Binding Date,Converter={StaticResource dateconvert}}" />

至此,一個簡單的值轉(zhuǎn)換器就完成了。

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

在綁定中的驗(yàn)證主要設(shè)計四個屬性:

  • ValidatesOnDataErrors或者ValidatesOnNotifyDataErrors(WPF 4.5之后才有的)—— 與DataErrorValidationRule或NotifyDataErrorValidationRule組合使用
  • ValidatesOnExceptions —— 與ExceptionValidationRule組合使用
  • NotifyOnValidationError —— 控制是否觸發(fā)Validation.Error事件,用于額外的內(nèi)容處理
  • ValidationRules —— 驗(yàn)證規(guī)則,用于定義驗(yàn)證規(guī)則集合

下面我們以異常驗(yàn)證規(guī)則來簡要介紹驗(yàn)證規(guī)則的使用 —— 驗(yàn)證處理涉及的內(nèi)容有很多,單此一節(jié)無法描述完整,故僅列舉最簡單的使用方式:

首先是后臺類的定義:

class ForExceptionValidate
{
 private int max;
 public int Max
 {
  get { return max; }
  set
  {
   if (value > 100)
   {
    throw new Exception("Max不能超過100");
   }
   max = value;
  }
 }
}

this.forvalidate.DataContext = new ForExceptionValidate();

然后是界面使用:

<StackPanel x:Name="forvalidate">
 <TextBox >
  <TextBox.Text>
   <Binding Path="Max" >
    <Binding.ValidationRules>
     <ExceptionValidationRule></ExceptionValidationRule>
    </Binding.ValidationRules>
   </Binding>
  </TextBox.Text>
 </TextBox>
</StackPanel>

在此 示例 中,后臺類中拋出的異常,會作為界面的驗(yàn)證結(jié)果來處理 —— 所以此處雖然沒有明確使用異常捕獲,但程序并 不會崩潰。

依賴屬性

最后,簡要說下依賴屬性,所有上面的綁定基礎(chǔ)都需要靠依賴屬性。所有需要綁定功能的屬性都進(jìn)行了對應(yīng)依賴屬性(System.Windows.DependencyProperty)定義。在WPF中,我們大部分時間是在用依賴屬性 —— 各種綁定,而自己的定義依賴屬性的情況相對較少,所以此處就不再介紹如何定義依賴屬性 —— 作為入門介紹教程。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 運(yùn)用示例簡單講解C#取消令牌CancellationTokenSource

    運(yùn)用示例簡單講解C#取消令牌CancellationTokenSource

    這篇文章運(yùn)用示例簡單講解C#取消令牌CancellationTokenSource,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C#實(shí)現(xiàn)經(jīng)典飛行棋游戲的示例代碼

    C#實(shí)現(xiàn)經(jīng)典飛行棋游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)經(jīng)典的飛行棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#遞歸算法之快速排序

    C#遞歸算法之快速排序

    快速排序由C.A.R發(fā)明,它依據(jù)中心元素的值,利用一系列遞歸調(diào)用將數(shù)據(jù)表劃分成越來越小的子表。在每一步調(diào)用中,經(jīng)過多次的交換,最終為中心元素找到最終的位置。
    2016-06-06
  • C# ListView雙擊Item事件

    C# ListView雙擊Item事件

    ListView沒有Item的雙擊事件,只能通過變通的方法得到,以下是我的變通方法
    2009-09-09
  • C#實(shí)現(xiàn)winform版飛行棋

    C#實(shí)現(xiàn)winform版飛行棋

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)winform版飛行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C#中接口的顯式實(shí)現(xiàn)與隱式實(shí)現(xiàn)及其相關(guān)應(yīng)用案例詳解

    C#中接口的顯式實(shí)現(xiàn)與隱式實(shí)現(xiàn)及其相關(guān)應(yīng)用案例詳解

    最近在學(xué)習(xí)演化一款游戲項目框架時候,框架作者巧妙使用接口中方法的顯式實(shí)現(xiàn)來變相對接口中方法進(jìn)行“密封”,增加實(shí)現(xiàn)接口的類訪問方法的“成本”,這篇文章主要介紹了C#中接口的顯式實(shí)現(xiàn)與隱式實(shí)現(xiàn)及其相關(guān)應(yīng)用案例,需要的朋友可以參考下
    2024-05-05
  • WPF中使用CallerMemberName簡化InotifyPropertyChanged的實(shí)現(xiàn)

    WPF中使用CallerMemberName簡化InotifyPropertyChanged的實(shí)現(xiàn)

    這篇文章介紹了WPF中使用CallerMemberName簡化InotifyPropertyChanged的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 詳解C#對XML、JSON等格式的解析

    詳解C#對XML、JSON等格式的解析

    這篇文章主要介紹了詳解C#對XML、JSON等格式的解析,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • 使用Visual Studio2019創(chuàng)建C#項目(窗體應(yīng)用程序、控制臺應(yīng)用程序、Web應(yīng)用程序)

    使用Visual Studio2019創(chuàng)建C#項目(窗體應(yīng)用程序、控制臺應(yīng)用程序、Web應(yīng)用程序)

    這篇文章主要介紹了使用Visual Studio2019創(chuàng)建C#項目(窗體應(yīng)用程序、控制臺應(yīng)用程序、Web應(yīng)用程序),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-03-03
  • C#并發(fā)編程入門教程之概述

    C#并發(fā)編程入門教程之概述

    這篇文章主要給大家介紹了關(guān)于C#并發(fā)編程之概述的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評論