初學者。博客僅做個人的理解整理,不到位的地方歡迎大佬們指出,感謝。
1.綁定使用的關鍵字:Binding
2.為什么要?
把界面上的控件的屬性和后台的變量綁定起來,達到效果:在后代修改變量,界面自動更新數據。
控件的屬性必須時依賴屬性或者依賴附加屬性才能綁定
3.綁定表達式中常用的關鍵字:
Source、ElementName、DataContext、RelativeSource、Path、XPath
4.例子
既然要綁定,就會有誰綁定誰的關系,也就是綁定目標,綁定數據源,數據從哪里到哪里。
4.1界面上2個控件進行綁定:使用ElementName指定綁定目標,Path指定綁定目標的具體的屬性
2個textblock,textbloc2的text屬性綁定textblock1的text
上面這種綁定如果不寫path呢?找不到綁定目標對象的屬性,就會顯示綁定目標的對象類型
綁定目標的屬性也可能是一個對象,而不是一個基本類型,這時候還可以繼續綁定,綁定目標屬性的屬性的屬性,這樣。
如:
textblock2的text屬性綁定textblock1的text的屬性的length屬性
4.2控件的屬性綁定一個string,list,和類對象
<TextBlock Text="{Binding Mytest}"/>
Textblock的text屬性綁定一個string類型的變量Mytest,Mytest定義在主窗體的cs文件中(MainWindow.xaml.cs)
public string Mytest { get; set; } = "testvalue";
先看下結果:
這時候需要注意一下,textblock控件時在xaml中,Mytest變量是在Class1.cs中,需要指定一個datacontext,不然在xaml中找不到變量Mytest
在class1類中定義一個list
界面上控件textblock綁定到這個list,直接綁定list,會顯示對象類型,可以通過下標的方式,指定綁定到list中的某個元素
Path可以省略掉,直接寫屬性,這都沒寫source,3個textblock會從datacontext去找
DataContext和resource一樣,每個控件對象都有,先找自身的,然后找父對象的,最后找到window窗體的。
5.RelativeSource:PreviousData TemplatedParent Self FindAncestor
5.1 Self
綁定目標屬於自己的某個屬性,如,textblock的text綁定自己屬性height
<TextBlock Height="36" Background="Moccasin" Text="{Binding Path=Height,RelativeSource={RelativeSource Mode=Self}}"/>
5.2 FindAncestor
綁定時,如果不知道數據源的名字,無法使用elementname,那么AncestorType可以指定從哪個控件類型找,或AncestorLevel從自己向上找父對象的層數,如果指定了AncestorType,那么AncestorLevel的層數會略過非AncestorType類型的控件
<Border Name="Border1"> <StackPanel Name="Stacpanel2"> <Border Name="Border2"> <StackPanel Name="Stacpanel1"> <Border Name="Border3"> <TextBlock Background="Red" Text="{Binding Path=Name ,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Border,AncestorLevel=2}}"/> </Border> </StackPanel> </Border> </StackPanel> </Border>
6.UpdateSourceTrigger
綁定的兩端,一端發生變化,什么時候或者什么情況才觸發另一端變化?
4種情況:默認,屬性一旦發生變化,控件失去焦點,顯示(寫代碼手動觸發)
mode:兩端數據變化,是單向還是雙向,還是只觸發一次
7.靜態對象怎么綁定?
定義:
綁定:
<!--綁定靜態變量--> <TextBlock Background="DarkKhaki" Text="{Binding (local:Class2.StaticValue)}"/>