WPF之Binding(转)
WPF之Binding
Binding即綁定,聽上去像一個音譯詞,很有趣,我們生活中常用的類似還有一個詞,叫want to,我們叫妄圖,只不過略加了感情色彩,扯遠了,回到正題說綁定。
感覺這個東西在WPF中的處于核心位置,他就像一座橋梁,把我們要處理的UI、邏輯數據聯系到了一起,也正因為他,使得我們的開發理念從UI驅動轉向了數據驅動,使我們能夠更專注于業務邏輯。
既然說Binding像橋梁,我們就來說說橋的兩端,以及他們是如何聯系的。
我們把這座橋的兩端分別叫做Source(源)和Target(目標),當然哪端是源,哪段是目標都是可以相互轉化的,還可能是雙向的。
1.Source的范圍非常廣,凡是可以封裝數據,并且通過屬性的方式暴露出來的都可以作為源
2.Target就有一定的限制,因為綁定只能綁定到目標的依賴屬性上,所以說只有DependcyObject對象才可以是綁定的對象
常用的指定方式
1.普通的CPR對象
2.CLR集合 包括數組 List 一般是把集合數據指定給Item Control類的Item Source充當數據源
3.ADO.Net對象 包括DataTable DataView
4.DataProvider 這其中包括XmlDataProvider和ObjectDataProvider,DataProvider是實現了INotifyPropertyChanged接口的類,所以可以做到及時通知
5.DependcyObject 依賴對象不但可以做為綁定目標,也可以做源
6.LINQ
7.指定源的時候還可以通過ElementName用于XAML代碼中不能訪問UI對象的時候 RelativeSource用于相對自身的時候
指定方法
通過BindingOperations.SetBinding(DependencyObject Target,DependencyProperty db,Binding binding)方法,第一個參數表示綁定到哪個對象上,第二個參數表示綁定到對象的哪個屬性上,第三個參數表示應用哪個綁定
Binding對象有這么幾個重要屬性
Source綁定源 可以為空 為空的時候表示取當前對象的DataContext屬性(可以繼承自父容器)
Path 源的哪個屬性 為空的時候表示源本身就是數值
Mode 是BindingMode類型的枚舉 控制數據流向
UpdateSourceTrigger UpdateSourceTrigger類型的枚舉 控制更新的時機
當綁定對象為FrameworkElement類型的時候,綁定方法可以是SetBinding(DependcyProperty dp,Binding binding)因為做了封裝,BindingOperations.SetBinding方法的第一個參數設為this
下面是兩個DataProvider作為源的例子
XMLProvider寫在窗體Resurce中XMLProvider寫在窗體Resurce中
<Window x:Class="DataProviderBindingPractise.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="205" Width="300">
<Window.Resources>
<XmlDataProvider x:Key="xmlPro" Source="XMLFile1.xml" XPath="Data/Student"></XmlDataProvider>
</Window.Resources>
<StackPanel>
<ListView x:Name="lvStu" Height="130" Margin="5" ItemsSource="{Binding Source={StaticResource xmlPro}}">
<ListView.View>
<GridView>
<GridViewColumn Header="Id" Width="80" DisplayMemberBinding="{Binding XPath=@Id}"/>
<GridViewColumn Header="Name" Width="80" DisplayMemberBinding="{Binding XPath=Name}"/>
<GridViewColumn Header="Age" Width="80" DisplayMemberBinding="{Binding XPath=Age}"/>
</GridView>
</ListView.View>
</ListView>
<!--<Button x:Name="btnLoad" Height="25" Margin="5,0" Click="btnload_Click"/>-->
</StackPanel>
</Window>
也可以寫在CodeBehinde中
View Codevoid InitList()
{
XmlDataProvider xdp = new XmlDataProvider();
xdp.Source = new Uri(@"http://www.cnblogs.com/XMLFile1.xml", UriKind.Relative);
xdp.XPath = @"Data/Student";
this.lvStu.DataContext = xdp;
this.lvStu.SetBinding(ListView.ItemsSourceProperty, new Binding());
}
ObjectDataProvider
1.Calculator具體類1.Calculator具體類
class Calculator
{
public string Add(string arg1, string arg2)
{
double x = 0;
double y = 0;
if (double.TryParse(arg1, out x) && double.TryParse(arg2, out y))
{
return (x + y).ToString();
}
else
{
return "Input Error";
}
}
}
綁定對象
//ObjectDataProvider作為數據源
private void SetCalculatorBinding()
{
ObjectDataProvider odb = new ObjectDataProvider();
odb.ObjectInstance = new Calculator();
odb.MethodName = "Add";
odb.MethodParameters.Add("0");
odb.MethodParameters.Add("0");
Binding binding1 = new Binding("MethodParameters[0]")
{
Source = odb,
BindsDirectlyToSource = true,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};
Binding binding2 = new Binding("MethodParameters[1]")
{
Source = odb,
BindsDirectlyToSource = true,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};
Binding binding3 = new Binding(".") { Source=odb };
txt1.SetBinding(TextBox.TextProperty, binding1);
txt2.SetBinding(TextBox.TextProperty, binding2);
txt3.SetBinding(TextBox.TextProperty, binding3);
}
?ps.今天問了下項目組長現在項目的開發模式,畢竟初來乍到,對開發方式不了解的話,適應起來很慢,就顯得非常不好了。問的結果讓我松了一口氣,因為項目現在還沒有使用MVVM的開發模式,還是事件委托的方式,這就跟ASP.Net差不多了,只是前臺界面的方式不一樣。我的目標是盡快掌握各種方法,然后再選一個方向深入研究,在這個百家爭鳴的時代,不多了解一些,難免顯得眼界不夠開廣。
轉載于:https://www.cnblogs.com/LiZhongZhongY/p/10896728.html
總結
以上是生活随笔為你收集整理的WPF之Binding(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java并发编程,3分分钟深入分析vol
- 下一篇: 逆向-攻防世界-reverse-box