亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

WPF快速入門教程之綁定Binding

2019-10-29 19:58:33
字體:
來源:轉載
供稿:網友

綁定(Binding)元素介紹

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

WPF,綁定,Binding

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

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

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

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

其中Path=可以省略,因為Binding元素含有一個帶參構造函數,其參數為path。另外,示例中A.B需具體到屬性,如果A已經是需要綁定的具體屬性,則可以用A替換A.B。即最簡單的格式是:

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

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

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

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

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

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

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

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

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

控件綁定

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

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

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

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

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

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

數據綁定

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

下面以一個最簡單的示例解釋數據綁定:

后臺類 —— 數據源結構:

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

數據源初始化 —— 創建數據并將數據綁定到界面:

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

界面控件設置 —— 指定控件綁定到源數據的哪個屬性:

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

其中設置了Grid的DataContext,即表示Grid內部數據上下文是以設置的數據源為基礎,在此示例中,Text屬性綁定的Count就是以ForDataBinding類對象為基礎查找屬性。 —— 即綁定路徑是以當前位置以樹形結構往下查找對應屬性。

其他元素

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

數據格式化轉換

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

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

后臺類:

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>

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

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

首先定義DateConverter,實現接口IValueConverter,代碼如下:

class DateConverter : IValueConverter{ /// <summary> /// 數據源轉界面顯示 /// </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> /// 界面顯示轉數據源 /// </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直接定義在當前窗體類命名空間下,所以其已經默認添加了如下空間,如果定義在其他位置,則需要手動添加空間引用。

xmlns:local="clr-namespace:Binding_Demo"

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

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

最后,則將值轉換器應用到控件上,代碼如下:

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

至此,一個簡單的值轉換器就完成了。

數據驗證

在綁定中的驗證主要設計四個屬性:

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

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

首先是后臺類的定義:

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>

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

依賴屬性

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品日韩av| 国产精品 欧美在线| 亚洲精品国产精品乱码不99按摩| 国产主播喷水一区二区| 日韩一区二区三区国产| 性日韩欧美在线视频| 亚洲黄色www| 久久视频在线视频| 精品偷拍各种wc美女嘘嘘| 亚洲国产欧美一区二区三区同亚洲| 日韩精品久久久久久福利| 欧美精品www| 亚洲男女自偷自拍图片另类| 亚洲开心激情网| 久久久久久中文字幕| 欧美日产国产成人免费图片| 色妞久久福利网| 国产精品中文久久久久久久| 亚洲视频在线观看免费| 成人中文字幕在线观看| 久久久国产精品x99av| 亚洲男人的天堂网站| 国产精品羞羞答答| 亚洲区在线播放| 久精品免费视频| 色系列之999| 成人精品一区二区三区电影黑人| 欧美精品在线播放| 亚洲老头同性xxxxx| 国模吧一区二区三区| 国产成人一区二区在线| 国产精品高清在线观看| …久久精品99久久香蕉国产| 亚洲人成电影在线观看天堂色| 国产精品美乳在线观看| 国产成人一区二区三区| 7m第一福利500精品视频| 国产91在线播放精品91| 国产精品国产三级国产专播精品人| 日韩免费黄色av| 色伦专区97中文字幕| 最好看的2019的中文字幕视频| 日韩电影大片中文字幕| 亚洲裸体xxxx| 中文在线资源观看视频网站免费不卡| 亚洲欧美日韩精品久久亚洲区| 国产精品视频最多的网站| 亚洲a级在线观看| 亚洲精品99999| 日本aⅴ大伊香蕉精品视频| 欧美日韩国产中文精品字幕自在自线| 91av在线播放| 久久久亚洲成人| 久久久国产精品视频| 91av在线不卡| 日韩在线观看高清| 国产精品久久久久秋霞鲁丝| 亚洲精品456在线播放狼人| 国产精品一区久久| 26uuu另类亚洲欧美日本老年| 亚洲经典中文字幕| 国产欧美一区二区三区久久| 777午夜精品福利在线观看| 亚洲一区二区三区777| 成人福利在线视频| 国产91在线高潮白浆在线观看| 久久综合五月天| 日韩中文字幕在线播放| 欧美成人高清视频| 国产91久久婷婷一区二区| 亚洲一区二区精品| 久久久亚洲精选| 国产精品十八以下禁看| 国产精品美女免费视频| 68精品国产免费久久久久久婷婷| 国产不卡一区二区在线播放| 色妞久久福利网| 亚洲欧美国产日韩中文字幕| 国产一区二区三区四区福利| 国产日韩在线播放| 亚洲精品久久久久中文字幕二区| 91在线观看免费观看| 成人在线视频网| 懂色av中文一区二区三区天美| 亚洲综合精品一区二区| 国产精品久久久久久久久久久不卡| 精品无码久久久久久国产| 国产不卡av在线免费观看| 久久精品国产综合| 国产成人在线视频| 精品欧美aⅴ在线网站| 色综合久久中文字幕综合网小说| 激情成人中文字幕| 一区二区三区视频免费| 91麻豆桃色免费看| 中文字幕在线看视频国产欧美在线看完整| 亚洲人成电影在线观看天堂色| 欧美在线播放视频| 亚洲精品白浆高清久久久久久| 日韩av免费在线播放| 欧美日韩国产精品一区二区不卡中文| 麻豆乱码国产一区二区三区| 精品人伦一区二区三区蜜桃免费| 国产成人精品电影久久久| 亚洲国产欧美一区二区三区同亚洲| 亚洲精品美女久久久久| 中文字幕日韩精品有码视频| 大胆人体色综合| 欧美综合国产精品久久丁香| 成人免费淫片视频软件| 91牛牛免费视频| 国产精品久久国产精品99gif| 久久久成人精品视频| 欧美大片在线影院| 欧美野外猛男的大粗鳮| 国产精品久久久久久av福利| 中文字幕国产精品久久| 亚洲精品www久久久| 成人精品一区二区三区电影黑人| 亚洲一二三在线| 中文字幕精品影院| 国产精自产拍久久久久久| 精品国产91久久久久久老师| 日韩综合中文字幕| 91精品免费视频| 欧美极品欧美精品欧美视频| 欧美在线精品免播放器视频| 亚洲精品第一页| 色午夜这里只有精品| 97在线视频免费播放| 丝袜亚洲欧美日韩综合| 中文字幕久热精品在线视频| 亚洲精品97久久| 国产日韩在线亚洲字幕中文| 久久免费精品日本久久中文字幕| 欧美疯狂做受xxxx高潮| 欧美综合一区第一页| 国产精品狼人色视频一区| 91香蕉电影院| 清纯唯美日韩制服另类| 亚洲视频免费一区| 欧美在线观看网站| 欧美成人剧情片在线观看| 日韩在线激情视频| 亚洲va欧美va在线观看| 中文字幕一精品亚洲无线一区| 欧美成人一区二区三区电影| 国产精品99久久99久久久二8| 国产成一区二区| 成人av在线天堂| 欧美成人高清视频| 精品国产一区二区三区久久久狼| 69精品小视频| 欧美日韩精品在线| 日韩av高清不卡| 国产精品久久久久久久久男| 国产精品福利网| 欧美一区三区三区高中清蜜桃| 欧美专区在线视频| 欧美与欧洲交xxxx免费观看| 国产视频在线观看一区二区| 亚洲香蕉成人av网站在线观看| www.精品av.com| 91精品国产免费久久久久久|