欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
“模板數據綁定”從XAML到代碼CODE
“模板數據綁定”從XAML到代碼CODE
 
數據綁定(data binding)指的是將控件和element連接到數據的一種機制。數據綁定可以很簡(jiǎn)單,例如將CheckBox控件連接到一個(gè)Boolean(布爾)變數;也可以很復雜,將整個(gè)數據庫連接到一個(gè)數據面板(panel)。

在GUI上面呈現控件,一般而言有兩種目的,一方面是向使用者顯示數據,另一方面是允許使用者改變數據。然而,在現代的API中,許多數據和控件之間的例行連接,都已經(jīng)被自動(dòng)化了。在過(guò)去,編程員必須寫(xiě)程序代碼,用布爾變數的值來(lái)初始化一個(gè)CheckBox,且將使用者操作過(guò)后的CheckBox值寫(xiě)到布爾變量中。在今天的現代化編程環(huán)境,程序員只需要定義CheckBox和此變量之間的綁定,就可以了,由數據綁定自動(dòng)進(jìn)行這兩件工作。數據綁定已經(jīng)變成一種相當普遍的做法,不只WPF,連Flex/Apollo也采用一樣的做法,甚至連語(yǔ)法都很類(lèi)似。
數據綁定常常用來(lái)取代事件處理器(event handler),這么做可以幫助程序代碼更簡(jiǎn)潔,特別是,如果在XAML中使用數據綁定取代事件處理器,可以使得我們不需要在code-behind文件中編寫(xiě)事件處理器。在某些例子中,甚至因此可以完全不用code-behind文件。(當然,事件處理器還是存在,只是被藏了起來(lái),我們目前看不見(jiàn)。)
來(lái)源與目標
每個(gè)數據綁定都具有來(lái)源(source)和目標(target)。一般來(lái)說(shuō),來(lái)源是某種數據,目標則是一個(gè)控件,但是實(shí)際上,你會(huì )發(fā)現來(lái)源和目標的區別有時(shí)候很模糊,有時(shí)候似乎會(huì )角色錯亂,竟然由目標提供數據給來(lái)源。雖然來(lái)源與目標這種方便的稱(chēng)呼方式,無(wú)法明確描述數據的流向,但是來(lái)源與目標的區別還是相當重要的。
最簡(jiǎn)單的綁定,就是兩個(gè)控件之間的綁定。比方說(shuō),假設你想要使用一個(gè)Label來(lái)觀(guān)看某ScrollBar的Value property。你可以為ScrollBar安裝一個(gè)ValueChanged事件處理器,或者你可以用更簡(jiǎn)單的方式,直接定義一個(gè)數據綁定,如下面的XAML片段所展示的這樣:
 
<ScrollBar Name="scroll"
    Orientation="Horizontal" Margin="24"
    Maximum="100" LargeChange="10" SmallChange="1" />
 
<Label HorizontalAlignment="Center"
    Content="{Binding ElementName=scroll, Path=Value}" />
 
綁定本身一定是在綁定的目標上做設定。在此XAML片段中,綁定是設定在Label的Content property上,語(yǔ)法如下:
 
Content="{Binding ElementName=scroll, Path=Value}"
 
Binding也是一種markup extension。大括號出現在Binding定義的周?chē)?。ElementName與Path都是Binding類(lèi)別的property,都可以出現在此定義中。在此Binding定義中,ElementName被設定成scroll,這是ScrollBar的名字(指定在Name attribute中);此Binding 的Path property被設定為Value,在這里就是參考到ScrollBar的Value property。此Label的Content property然后會(huì )被綁定到此ScrollBar的Value property。當你操作ScrollBar時(shí),Label就會(huì )顯示出目前的值。
盡管是XAML老手,你還是有可能會(huì )不小心在Binding的定義內使用引號。ElementName和Path看起來(lái)都像是XML attribute,所以你的手指頭會(huì )不小心鍵入這樣:
 
Content="{Binding ElementName="scroll" Path="Value"}"
 
這是不對的!不只不可以在大括號內使用引號,而且一定要在ElementName和Path項目之間使用逗號區隔。
另一方面,如果你真的無(wú)法控制自己,就是會(huì )不小心地在綁定定義內鍵入引號,那么或許你應該改用property element的語(yǔ)法。
 
<ScrollBar Name="scroll"
    Orientation="Horizontal" Margin="24"
    Maximum="100" LargeChange="10" SmallChange="1" />
 
<Label HorizontalAlignment="Center">
    <Label.Content>
        <Binding ElementName="scroll" Path="Value" />
    </Label.Content>
</Label>
 
綁定的目標不是隨便什么都可以,綁定必須建立在有支持dependency property的property上,因為控件和element都是設計成將改變反映在它們的 dependency property。綁定的目標必須衍生自DependencyObject。綁定所設定的property必須有支持dependency property。因此,在這個(gè)例子中,Label需要有一個(gè)字段元,類(lèi)型為DependencyProperty,名稱(chēng)為ContentProperty。
但是對于一個(gè)綁定來(lái)源來(lái)說(shuō),要求就寬松許多了。來(lái)源中被綁定的property,不需要是dependency property。在理想的例子中,property應該和事件有關(guān)連,此事件會(huì )指出何時(shí)此property改變了,但是有些綁定甚至可以在沒(méi)有通知事件的情況下運作。
模式變化
雖然來(lái)源和目標的稱(chēng)呼方式隱含的意義是:來(lái)源element(本例是指ScrollBar)會(huì )促使目標(Label)的改變,但其實(shí)這只是四種可能的綁定模式(mode)之一。你可以利用Mode property和BindingMode列舉的成員,指定你想要的模式。預定是這樣的:
 
Content="{Binding ElementName=scroll, Path=Value, Mode=OneWay}" 
 
請注意,Mode property的設定是和Path property的設定分開(kāi)的,中間有一個(gè)逗號。在BindingMode列舉成員OneWay的前后,并沒(méi)有使用引號。如果你比較喜歡property element語(yǔ)法,你可以改用下面的寫(xiě)法:
 
<Label.Content>
    <Binding ElementName="scroll" Path="Value" Mode="OneWay" />
</Label.Content>
 
你也可以設定模式為T(mén)woWay:
 
Content="{Binding ElementName=scroll, Path=Value, Mode=TwoWay}"
 
此程序的作用其實(shí)和OneWay時(shí)一樣,但是理論上,Label的Content property如果有改變,也會(huì )反映在ScrollBar的Value property。下面是另一種可能性:
 
Content="{Binding ElementName=scroll, Path=Value, Mode=OneTime}"
 
OneTime模式的意思是目標會(huì )從來(lái)源取得數據,進(jìn)行初始化,但是不會(huì )持續追蹤改變。在此程序中,Label顯示0,因為ScrollBar的初始Value property就是0。如果你操作ScrollBar,你會(huì )看到Label的值一直不受影響。(你可以把ScrollBar element的Value初始設定為50,這么一來(lái),你會(huì )看到Label顯示50。)
最后的選項是:
 
Content="{Binding ElementName=scroll, Path=Value, Mode=OneWayToSource}"
 
初次看到此模式會(huì )讓人遲疑,因為此模式指示來(lái)源要依據目標來(lái)更新,這等于是將來(lái)源和目標的角色對調。在這個(gè)例子中,目標(Label)應該要更新來(lái)源(ScrollBar),但是Label沒(méi)有數字數據可以提供給ScrollBar。此Label是空白的,且會(huì )當你移動(dòng)ScrollBar時(shí),會(huì )維持空白。
雖然,OneWayToSource模式似乎反常,但是當你想要建立某種綁定,而目標的property不支持dependency property,且來(lái)源的property有支持dependency property時(shí),你就會(huì )發(fā)現這個(gè)模式的妙用了:將綁定放在來(lái)源,將模式設定為OneWayToSource。
綁定的預定(default)Mode是由定義此綁定的此property所控制。例如:ScrollBar的Value property預定的綁定Mode是TwoWay。Mode property是綁定最重要的一部份,我們不需要去猜測(或查詢(xún))預定的綁定模式為何,而是應該好好考慮,決定該使用什么Mode會(huì )比較恰當,然后明確地做設定。
DataContext
DataContext property是另一種表達綁定來(lái)源對象的方式,請看下面的例子:
 
<ScrollBar Name="scroll"
    Orientation="Horizontal" Margin="24"
    Maximum="100" LargeChange="10" SmallChange="1" />
 
<Label HorizontalAlignment="Center"
    DataContext="{Binding ElementName=scroll}"
    Content="{Binding Path=Value}" />
 
Label的DataContext與Content,都被設定到一個(gè)Binding的定義中,此定義被分成兩部分。第一部份的Binding定義指示ElementName,且第二個(gè)部分具有Path。
在此范例中使用DataContext property,沒(méi)有好處,但是在某些其它的例子,DataContext property可能相當有價(jià)值。DataContext是可以在element tree中被沿襲,所以如果你為一個(gè)element設定DataContext,則該element所有的孩子都會(huì )受到影響。
如果一個(gè)面板內,許多控件都綁定到一個(gè)特定對象的各種property上,這種狀況下,只要將此DataContext設定成該型態(tài)的不同對象,所有的控件都會(huì )反映此新對象。
dependency property的好處
綁定的來(lái)源不需要是dependency property。到目前為止,所有的數據綁定范例的目標和來(lái)源,都同時(shí)具備后端的dependency property,但是本章稍后會(huì )有不一樣的例子,綁定來(lái)源是傳統的(沒(méi)有dependency property)的.NET property。字在一般的例子中,OneWay綁定牽涉到從來(lái)源到目標的信息連續傳送。單向的綁定想成功,來(lái)源必須實(shí)現某種機制,以使得來(lái)源一有變動(dòng)就會(huì )讓目標被通知。
前面所謂的某種機制,當然可能是指事件,但是還有別的可能。dependency property之所以被發(fā)明,其中一個(gè)原因是為了數據綁定,且dependency property系統具有內建的通知(notification)支持。綁定來(lái)源不需要是dependency property,但是如果是的話(huà),會(huì )有幫助的。只要定義DependencyProperty,就可以免費得到數據綁定通知。
兩個(gè)metadata標志影響數據綁定,如果你包含FrameworkPropertyMetadataOptions.NotDataBindable標志,其它的元素flag,仍然可以綁定到dependency property,但是你無(wú)法在一個(gè)dependency property本身定義一個(gè)數據綁定。(換句話(huà)說(shuō),將具有此flag的dependency property,不會(huì )是數據綁定的目標)。FrameworkPropertyMetadataOptions.BindsTwoWayByDefault標志只會(huì )影響dependency property為目標的綁定。
前面看過(guò),你將Binding的Path property設定成這些來(lái)源對象的property。那么,為何要叫做Path?為何不叫做Property?
之所以稱(chēng)為Path,因為它可以不只一個(gè)property??梢允且贿B串的property(可能附有索引)利用句號結合在一起,看起來(lái)像是C#程序代碼,但是卻沒(méi)有strong typing的麻煩。例如:
 
Path=Content.Children[1].SelectedItem.Content.Length
 
雖然這可能看起來(lái)像是C#程序代碼的一連串套迭property,但是這只是XMAL內的字符串,且會(huì )被當作字符串進(jìn)行解析(parse)。解析器使用refelction來(lái)決定這些項目是否有意義,如果沒(méi)有意義,解析的步驟會(huì )整個(gè)放棄,不產(chǎn)生任何結果或任何例外。
數據轉換與多重綁定
當數據從綁定來(lái)源送到目的地時(shí)(且有時(shí)候是反方向的),數據可能需要轉換類(lèi)型。Binding類(lèi)包含一個(gè)property,名為Converter,讓你可以指定轉換器類(lèi)。此類(lèi)必須包含兩個(gè)方法:Convert與ConvertBack,以進(jìn)行轉換。
進(jìn)行轉換的類(lèi)必須實(shí)現IValueConverter接口,看起來(lái)像這樣:
 
public class MyConverter: IValueConverter
{
    public object Convert(object value, 
       Type typeTarget,object param, 
       CultureInfo culture)
    {
        ...
    }
    Public object ConvertBack(object value, 
       Type typeTarget,object param, 
       CultureInfo culture)
    {
        ...
    }
}
 
這里的value參數是要被轉換的對象,而typeTarget是要被轉換成的型態(tài),也就是此方法傳出值的型態(tài)。如果它無(wú)法轉換成該指定型態(tài),此方法應該要傳出null。第三個(gè)參數是Binding的ConvertParameter property會(huì )指定的對象,最后一個(gè)參數用來(lái)指示轉換時(shí)要注意到的地域文化(culture)。
如果你是在C#中建立Binding,你可以將Convert property設定成一個(gè)有實(shí)現IValueConverter接口的對象:
 
Binding bind = new Binding();
bind.Convert = new MyConverter();
 
你也可以將Binding的ConvertParameter property設定成一個(gè)對象,被當作param參數傳遞進(jìn)入Convert與ConvertBack,以控制轉換過(guò)程。
有一種綁定一定會(huì )需要轉換類(lèi)別,那就是多重綁定(multi-binding)。多重綁定從多個(gè)來(lái)源聯(lián)合多個(gè)對象,進(jìn)入一個(gè)單一的目標(例如,將紅、綠、藍三原色合并成為單一個(gè)Color對象)。多重綁定轉換器,必須實(shí)現此IMultiValueConverter接口。
延遲更新
我們目前為止所看過(guò)的binding,都從來(lái)源source element立即更新目標。有時(shí)候這不一定是我們想要的。當你在TextBox鍵入文字,改變底下數據庫的某個(gè)字段,你希望每按下一次按鍵就改變數據庫一次嗎?其中還包括你打錯字并按下退格鍵做修改的部分。當然不!只有當你完成文字的輸入,你才希望來(lái)源被更新,而判別這個(gè)時(shí)機最簡(jiǎn)單的方式,就是當你此TextBox失去輸入焦點(diǎn)的時(shí)候。
藉由設定此綁定的UpdateSourceTrigger property,你可以改變更新數據的行為。你可以將它設定為UpdateSourceTrigger列舉的一個(gè)成員,LostFocus(這是TextBox的Text property預定值)、PropertyChanged(對于大多數的property來(lái)說(shuō)最常見(jiàn))、或Explicit(這需要程序做出特別的動(dòng)作,來(lái)反映在來(lái)源上)。
例如,將綁定改成這樣:
 
Text="{Binding ElementName=txtbox1, Path=Text,       
 Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
 
現在每次對TextBox按下按鍵,來(lái)源的TextBox會(huì )跟著(zhù)改變。
UpdateSourceTrigger.Explicit選項需要做更多事才能運作。使用此選項的程序,也必須準備對定義此綁定的element引用其GetBindingExpression方法(這是FrameworkElement所定義的方法),自變量是此綁定所牽涉到的DependencyProperty:
 
BindingExpression bindexp =
    txtboxSource.GetBindingExpression(TextBox.TextProperty);
 
當你想要從目標更新來(lái)源時(shí)(或許當按下標示Update的按鈕時(shí)),就引用:
 
bindexp.UpdateSource();
 
此引用無(wú)法推翻綁定模式。綁定模式必須是TwoWay或OneWayToSource,否則此引用會(huì )被忽略。
Source property
如果你想要開(kāi)始從數據庫以及其它外部類(lèi)別和對象的角度,思考關(guān)于數據綁定的一切,那么需要停用ElementName property,改用Source property。Source property參照到一個(gè)對象,而Path繼續指到該對象的一個(gè)property(或者一連串property)。
對于Source來(lái)說(shuō),一個(gè)可能性是x:Static markup extension。x:Static讓XAML文件可以參照到一個(gè)類(lèi)別內的一個(gè)靜態(tài)字段或property。在某些例子(例如用到Environment類(lèi)別的靜態(tài)字段),你可以使用x:Static本身取出那些property。然而,有可能你真正需要的是被此靜態(tài)property所參考到的對象的某個(gè)property。這種狀況下,你需要透過(guò)Source property來(lái)使用綁定。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
數據綁定
白話(huà) WPF/SL 綁定(Binding)
WPF中一個(gè)通用的BoolToXXX轉換類(lèi)
WPF中的控件布局
WPF DataGrid
SAP Fiori Elements propertyAnnotations 舉例講解
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久