1. 綁定到元素對象.(實際項目中用處不大)
界面上兩個關聯的控件之間綁定,比如一個TextBlock 的FontSize和一個Slider 的Value綁定:
<Slider Name="sliderFontText" Minimum="1" Maximum="100" Value="10"/> <TextBox Name="txtValue" Width="200" Text="{Binding ElementName=sliderFontText, Path=Value,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
Text的內容就是new了一個Binding對象,設置ElementName,Path等是綁定的屬性值.
XAML對應的C#代碼:
Binding binding = new Binding(); binding.ElementName = "sliderFontText"; binding.Path = new PropertyPath("Value"); binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; binding.Mode = BindingMode.TwoWay; txtValue.SetBinding(TextBox.TextProperty, binding);
刪除綁定:
BindingOperations.ClearBinding(txtValue, TextBox.TextProperty);
綁定后屬性的操作,如刪除綁定,獲取控件綁定對象,都可以使用System.Windows.Data.BindingOperations的靜態方法.
名稱 |
說明 |
OneWay |
源屬性 -> 目標屬性(源變化引發目標變化) |
TwoWay |
源屬性 <-> 目標屬性(源變化引發目標變化且目標變化也引發源變化) |
OneTime | 首次執行 源屬性 -> 目標屬性,后面所有變化忽略(除非顯示調用BindingExpress.UpdateTarget()或者重新綁定完全不同的對象 |
OneWayToSource |
和OneTime綁定方式相反 |
Default | 依賴綁定目標屬性 |
UpdateSourceTrigger枚舉值介紹:
名稱 |
說明 |
PropertyChanged |
目標屬性變化 -> 立即更新源 |
LostFocus |
目標屬性變化 + 目標失去焦點 -> 更新源 |
Explicit |
調用BindingExpression.UpdateSource() -> 更新源 |
Default |
大部分為PropertyChanged,Textbox.Text是LostFocus |
2. 綁定非界面元素
1. 綁定靜態類的靜態屬性(系統預定義和自定義方法一致,這里演示一個自定義):
XAML(c是 命名空間WPFDemo的別名):
<Button Content="{Binding Source={x:Static c:MyRes.Name}}"/>
C#:
namespace WPFDemo
{
public static class MyStaticRes
{
public static string Name { get { return "返回的Name"; } }
}
2.綁定一般類的一般屬性
XAML:首先需要新建一個資源對象,
創建資源對象:
<Window.Resources> <c:MyRes x:Key="customRes" Name="自定義資源文本"></c:MyRes> </Window.Resources>
XAML綁定:
<Button Content="{Binding Source={StaticResource customRes},Path=Name}"/>
C#:
namespace WPFDemo
{
public class MyRes
{
public string Name { get; set; }
}
}
3. 相對綁定
XAML(這里將StackPanel的Name綁定到Button的Content屬性中):
<StackPanel x:Name="LayoutRoot"> <Button Content="{Binding Path=Name, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type StackPanel}}}"/> </StackPanel>
RelativeSource 的Model枚舉值值:
名稱 | 說明 |
Self | 綁定自己的另外一個屬性 |
FindAncestor | 綁定到父元素,需要設置父元素類型AncestorType和父元素層次AncestorLevel(默認為1) |
PreviousData | 綁定到數據綁定列表的前一項 |
TemplateParent | 綁定到應用模板的元素 |
<Button Content="{Binding Path=Name}" DataContext="{Binding Source={StaticResource myRes}}"/>
或者
<StackPanel Name="MainLayout" DataContext="{Binding Source={StaticResource myRes}}"> <Button Content="{Binding Path=Name}" /> </StackPanel>
屬性 |
含義 |
ElementName |
是指綁定的源元素(這里一般指界面元素) |
Path |
源元素的綁定關聯屬性 |
UpdateSourceTrigger |
更新綁定屬性的時機 |
Model |
更新綁定的方式 |
Source | 提供數據的引用 |
RelativeSource | 使用一個RelativeSource對象指向源對象,主要是相對數據源綁定使用 |
DataContext | 最重要的綁定,沒有Source或者RelativeSource,WPF就按照元素樹向上查找DataContext屬性,並使用第一個非空的DataContext屬性 |
到這里,基本的Banding就復習完了,這里有一個體會就是,xaml有時候會忘記語法的寫法,其實XAML中也是由一個一個的對象組成,組成方式時New一個一個的對象,實例化方式時: {對象類 屬性1=XX, 屬性2=XX}.
本文Demo項目下載:http://files.cnblogs.com/files/zhaoxixi/WPFDemo.rar