小編給大家分享一下WPF中如何綁定Binding,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
我們提供的服務(wù)有:成都網(wǎng)站制作、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、黃平ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的黃平網(wǎng)站制作公司綁定(Binding)元素介紹
首先,盜用張圖。這圖形象的說明了Binding的機(jī)理。
此處主要介紹的綁定類是System.Windows.Data.Binding,如果涉及其他內(nèi)容,將簡要介紹,不會(huì)過多說明。
下面將簡要介紹最基礎(chǔ)(最常用)的三個(gè)屬性:
1、Path —— 路徑,用于索引到具體的屬性,常常會(huì)省略書寫,示例如下:
<TextBox Text="{Binding Path=A.B}" />
其中Path=可以省略,因?yàn)锽inding元素含有一個(gè)帶參構(gòu)造函數(shù),其參數(shù)為path。另外,示例中A.B需具體到屬性,如果A已經(jīng)是需要綁定的具體屬性,則可以用A替換A.B。即最簡單的格式是:
<TextBox Text="{Binding A}" />
2、Mode —— 模式,用于指定數(shù)據(jù)的更新方向,它是一個(gè)枚舉類型,共有一下四種方式:
OneTime —— 一次性更新(只更新一次),從數(shù)據(jù)源更新到當(dāng)前使用的綁定屬性。
OneWay —— 單向更新,從數(shù)據(jù)源更新到當(dāng)前使用的屬性。
OneWayToSource —— 單向更新,從當(dāng)前使用的屬性更新到數(shù)據(jù)源。
TwoWay —— 雙向更新,當(dāng)前屬性與數(shù)據(jù)源同步。
注:如果未指定,即表示使用默認(rèn)模式,而在不同的依賴屬性上,其模式是不一樣的。在使用時(shí),如果不確定其默認(rèn)模式是否是自己需要的模式時(shí),則可以手動(dòng)指定。
3、UpdateSourceTrigger —— 數(shù)據(jù)源更新觸發(fā)器,用于指定控件上的屬性值什么時(shí)候更新到數(shù)據(jù)源,它也是個(gè)枚舉類型,有以下三種方式:
Explicit —— 顯示更新,需要調(diào)用UpdateSource方法后才能更新。
LostFocus —— 失去焦點(diǎn)更新
PropertyChanged —— 屬性值改變更新,大部分情況會(huì)使用此方式,但有時(shí)頻繁的更新數(shù)據(jù)源會(huì)降低效率,如在TextBox中,如果數(shù)據(jù)源有較多的數(shù)據(jù)驗(yàn)證,此時(shí)在輸入Text時(shí),就有可能出現(xiàn)界面卡頓的情況。
注:當(dāng)然,此處也有默認(rèn)值設(shè)置,但不同的控件 屬性的 默認(rèn) 值也不一樣,不過大部分情況下默認(rèn) 值是PropertyChanged,比較特殊的有TextBox的Text屬性,其默認(rèn)值是LostFocus。
下面給一個(gè)最常用的綁定書寫方式:
<TextBox Text="{Binding A,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" />
控件綁定
控件綁定,即在同一個(gè)界面中不同控件之間的數(shù)據(jù)同步處理,最常見的就是滑動(dòng)條與一個(gè)文本框之間的綁定。在控件綁定中,需要指定綁定類的ElementName屬性值,即當(dāng)前屬性綁定到哪一個(gè)控件的屬性上。示例如下:
<Slider Name="slider" Maximum="100" /> <TextBox Text="{Binding ElementName=slider,Path=Value,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" />
注:在WPF開發(fā)中,我們常常是不為控件設(shè)置Name值的,而在控件綁定中,必須為源控件添加Name屬性值;而有些控件可能會(huì)不含有Name屬性,此時(shí)則使用x:Name來指定名稱。
在控件綁定中有一個(gè)比較特殊的存在——模板綁定-TemplateBinding,它與Binding并不在一個(gè)繼承結(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í)的項(xiàng)目開發(fā)中 ,常 會(huì)用到MVVM模式,數(shù)據(jù)綁定將會(huì)在那里體現(xiàn)出來,但MVVM模式開發(fā)則不在此節(jié)中敘述。
下面以一個(gè)最簡單的示例解釋數(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ù)的哪個(gè)屬性:
<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é)將簡要介紹幾個(gè)較為常用的內(nèi)容。
數(shù)據(jù)格式化轉(zhuǎn)換
在數(shù)據(jù)綁定中,有時(shí)我們需要顯示的數(shù)據(jù)與源數(shù)據(jù)不一樣,如時(shí)間格式,浮點(diǎn)數(shù)格式,或者更復(fù)雜一些的想要一個(gè)類對象中的多個(gè)屬性組合一起顯示。
對于簡單的數(shù)據(jù)格式化,可以通過StringFormat來處理,如時(shí)間格式化為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)換器來處理。下面我們以上面用到的時(shí)間轉(zhuǎn)化為例,假如我們要在前臺顯示yyyyMMdd格式的日期,此時(shí)從數(shù)據(jù)源顯示到界面可以正確處理,但是在界面輸入,它無法正確轉(zhuǎn)化為源數(shù)據(jù),即內(nèi)置的Converter不支持,此時(shí)我們就需要自己實(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)添加了如下空間,如果定義在其他位置,則需要手動(dòng)添加空間引用。
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}}" />
至此,一個(gè)簡單的值轉(zhuǎn)換器就完成了。
數(shù)據(jù)驗(yàn)證
在綁定中的驗(yàn)證主要設(shè)計(jì)四個(gè)屬性:
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>
在此 示例 中,后臺類中拋出的異常,會(huì)作為界面的驗(yàn)證結(jié)果來處理 —— 所以此處雖然沒有明確使用異常捕獲,但程序并 不會(huì)崩潰。
依賴屬性
最后,簡要說下依賴屬性,所有上面的綁定基礎(chǔ)都需要靠依賴屬性。所有需要綁定功能的屬性都進(jìn)行了對應(yīng)依賴屬性(System.Windows.DependencyProperty)定義。在WPF中,我們大部分時(shí)間是在用依賴屬性 —— 各種綁定,而自己的定義依賴屬性的情況相對較少,所以此處就不再介紹如何定義依賴屬。
以上是“WPF中如何綁定Binding”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章名稱:WPF中如何綁定Binding-創(chuàng)新互聯(lián)
本文URL:http://bm7419.com/article6/didjog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)站設(shè)計(jì)公司、企業(yè)網(wǎng)站制作、網(wǎng)站導(dǎo)航、面包屑導(dǎo)航、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容