日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

《深入浅出WPF》笔记——绑定篇(一)

發布時間:2023/12/1 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《深入浅出WPF》笔记——绑定篇(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  上一節,有記錄寫到:在WPF里,數據驅動UI,數據占核心地位,UI次之。怎么恢復數據的核心地位,那就要先了解一下Binding。

一、Binding 基礎

1.1WPF中Data Binding的帶來的方便

  在設計架構的時間,大家都很重視分層,為什么分層呢,其實分層就是為了更好的復用共同的類庫、更好的分工,以便更好的施工。。。,無論是為什么,就算它是一種時尚吧。為了追逐它,先記錄一下一般程序的層次:數據層,邏輯處理層,表現層。具體的每一個層可以再去細分。很多時間對于邏輯處理層和表現層經?;斐梢黄?#xff0c;最終成了邯鄲學步。在WPF中,如果綁定用的好的話,這種不好的結果將會很簡單的避免。具體是怎么樣避免的呢?讓我們先總體的把握一下Binding。為了更好的理解Binding,讓我們先舉個例子,Binding就像一條河流,可以用來劃分界限,又能作為通往兩個地方的必經之路。翻譯過來就是Binding是邏輯層和UI的分界線,當邏輯層處理了的數據,通過Binding界面能很快能感應得到,如果界面上的數據發生了變化,Binding會通知邏輯層做出相應的操作。(關于這一段,我只能弱弱的說,感覺不是特別的官方,因為對分層的理解我還處于菜鳥級的水平,希望大家狂噴啊,讓我能成長的更快)。

1.2 Binding基礎  

  我們可以把Binding比喻成一座數據橋梁,當一輛汽車要經過橋的話,就需要指明出發地-源(Source)和目的地-目標(Target),數據的從哪里來是源,到哪里去是Target,一般情況下,Binding源是邏輯層的對象,目標是UI層的控件對象。這樣數據不斷的通過Binding送達UI層,被UI層所展示也就完成了數據驅動UI的過程。我們可以想象在Binding這座橋上鋪了高速公路,不僅可以設置其方向是否是單向,還可以為雙向的,不僅如此,在雙向綁定的時間甚至可以設置一些"關卡",用來轉化數據類型或者是檢查數據的正確性。說了這么多,我想用一個例子,能更好的理解Binding。需求是:通過Binding,每次按一下按鈕為文本框的Age加1.具體的代碼說明在注釋里面已經寫明了。下面直接上代碼:

Person.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel;namespace Chapter_04 {class Person : INotifyPropertyChanged{//INotifyPropertyChanged向客戶端發出某一屬性值已更改的通知。public event PropertyChangedEventHandler PropertyChanged;private int age;public int Age{get { return age; }set{age = value;if (this.PropertyChanged != null){this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Age"));// 通知Binding是“Age”這個屬性的值改變了 }}}} } XAML <Window x:Class="Chapter_04.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="230" Width="250"><Grid Background="Azure"><TextBlock Height="23" HorizontalAlignment="Left" Margin="12,39,0,0" Name="textBlock1" Text="年齡:" VerticalAlignment="Top" Width="44" /><TextBox Height="23" HorizontalAlignment="Left" Margin="62,36,0,0" x:Name="txtAge" VerticalAlignment="Top" Width="120" Text="22" /><Button Content="年齡加1" Height="23" HorizontalAlignment="Left" Margin="107,114,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /></Grid> </Window> cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes;namespace Chapter_04 {/// <summary>/// MainWindow.xaml 的交互邏輯/// </summary>public partial class MainWindow : Window{Person p;public MainWindow(){InitializeComponent();//定義一個人的實例對象,并設置其初始值為文本框的值;p = new Person();p.Age = Convert.ToInt32(txtAge.Text);//準備binding 設置其源為剛剛創建的對象,并指定其訪問路徑為對象的Age字段,// Binding binding = new Binding();binding.Source = p;binding.Path = new PropertyPath("Age");//將數據源與目標連接在一起---其中把txtAge設置為綁定目標,并指定目標的屬性為 //靜態只讀DependencyProperty類型的依賴屬性TextBox.TextProperty.(運行是可以賦值的,注意與const的區別)//這類屬性的值可以通過binding依賴在其他對象的屬性值上,被其他隊形的屬性值所驅動。BindingOperations.SetBinding(this.txtAge, TextBox.TextProperty, binding);}private void button1_Click(object sender, RoutedEventArgs e){p.Age += 1;}} }

其中Cs的代碼可以把InitializeComponent();后面的代碼去掉,一句就搞定的

this.txtAge.SetBinding(TextBox.TextProperty, new Binding("Age") {Source= p=new Person(){Age=Convert.ToInt32(txtAge.Text)}});

最后的效果圖為圖1,并且點擊按鈕年齡加1:

圖1

這個不是跟以前的winform差不多嗎?初看差不多,但是這里讓年齡加1的是對象的屬性,而不是平時用的txtAge+=1。這樣做有個明顯得好處是,如果兩個文本框都綁定的p.Age,那么點擊下按鈕,兩個文本框都會加1.在這里源是p對象(沒有使用邏輯層),目標是txtAge控件。是不是對Binding有點感覺了。接下來介紹Binding的路徑(Path)和源(Source)。

?二、Binding的路徑和源

2.1把控件作為Binding的源與Binding標記擴展的完美結合

  除了邏輯層對象可以作為Binding的源外,控件也可以作為Binding的源,這樣是不僅能使UI元素產生聯動的效果,也會使Binding在控件間建立關聯。下面給出一個TextBox的值隨著Slider的值得變化而變化的例子。效果圖如圖2:

圖2

代碼如下:

XAML <Window x:Class="Chapter_04.ControlBinding"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="ControlBinding" Height="300" Width="300"><StackPanel><TextBox x:Name="textBox1" Text="{Binding Path=Value,ElementName=slider1}"/><Slider x:Name="slider1" Maximum="100" Minimum="0" Margin="5"/></StackPanel> </Window>

下面講解主要代碼:

<TextBox x:Name="textBox1" Text="{Binding Path=Value,ElementName=slider1}"/>

  前面的文章XAML的語法記錄中已介紹過標簽擴展:特征是含有引號中{}而且開始部分是其類型。咋一看好像是Binding類型的變量賦值給Text了,在這里可以把Binding看成一個函數,整體的{}標簽擴展為一個函數,返回值為Value。由于Binding帶一個路徑參數的構造函數,所以path=可以省略,寫成這樣<TextBox x:Name="textBox1" Text="{Binding Value,ElementName=slider1}"/>,如果改成后臺代碼(C#)的話可以這么寫:

this.textBox1.SetBinding(TextBox.TextProperty, new Binding("Value") { ElementName="slider1"});

  我們前面說過,綁定是可以雙向的,這里如果先輸入值會不會讓slider1根據文本框中的值指到相應的位置呢,答案是肯定的。那就去試試吧,試試的話好像沒有發現slider移動啊?在這里還需要知道一點,那就是Binding提供了數據流向的方向的屬性:Mode,它的類型為BindingMode的枚舉類型,可以取TwoWay、OneWay、OnTime、OneWayToSource、Default。在此肯定是默認的了,Default是根據情況來確定的。其實在上面的例子中是雙向的,slider為什么不能移動呢,是因為沒有textBox沒有失去焦點,按一下Tab就可以看到效果了,每次想讓Slider移動是不是必須要按一下Tab呢?肯定否定的,因為微軟對應Binding還提供了UpdateSourceTrigger屬性(描述綁定源更新的執行時間),其值可以為PropertyChanged(當綁定目標屬性更改時,立即更新綁定源,因為是更新源,用于目標對源的綁定,否則無效。多數依賴項屬性的默認值為PropertyChanged,TextBox默認值為LostFocus),Explicit(僅在調用 System.Windows.Data.BindingExpression.UpdateSource() 方法時更新綁定源),LostFocus。在這里,只需要在綁定里面加UpdateSourceTrigger=PropertyChanged就可以實現我們想要的結果了。除此之外Binding還有NotifyOnSourceUpdated和NotifyOnTargetUpdated屬性,設置為true的話,當源或目標被更新后會激發相應的SourceUpdated事件和TargetUpdated事件,實際工作中,我們還可以監聽兩個事件來找出有哪些數據更新了,或者是控件更新了。具體的用的時間在來細究,目前只記錄一下有這么一回事。

2.2 Binding的路徑(Path)

  Binding的源是一個對象,一個對象又會有多個屬性,通常我們要顯示的對象的某個屬性,就用Binding的路徑(Path)屬性來指定(有的時候也可以不指定Path),Path的實際類型為PropertyPath。除此之外,有的對象的屬性也是對象、對象里面含有多個相同類型的屬性取默認值以及對象的索引,我們同樣可以指定它,下面通過例子來說明,效果為圖3:

圖3

?

下面給出代碼:

XAML <Window x:Class="Chapter_04.Path"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Path" Height="500" Width="805"><Grid Background="Gold"><Grid.RowDefinitions><RowDefinition Height="1*" /><RowDefinition Height="1*" /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><!--源的屬性作Path--><Grid Background="Azure"><Grid.RowDefinitions><RowDefinition Height="1*" /><RowDefinition Height="1*" /><RowDefinition Height="1*" /><RowDefinition Height="1*" /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="1*"/><ColumnDefinition Width="2*"/></Grid.ColumnDefinitions><TextBlock Name="txtBlockPath1" Text="源的屬性作Path" VerticalAlignment="Bottom" HorizontalAlignment="Center" Grid.ColumnSpan="2" Grid.Row="0" /><TextBlock Name="txtBlock1" Text="計算文本框字符串的長度" Height="25" VerticalAlignment="Bottom" HorizontalAlignment="Center" Grid.ColumnSpan="2" Grid.Row="1" /><TextBlock Name="textBlockString" Text="請輸入字符:" Height="25" Width="67" HorizontalAlignment="Right" Grid.Row="2" Grid.Column="0"/><TextBox Name="textBox" Width="240" Height="25" Grid.Column="2" Grid.Row="2" /><TextBlock Name="textBlockStringLong" Text="字符串長度為:" HorizontalAlignment="Right" Height="23" Grid.Row="3" Grid.Column="0"/><TextBox Name="textBox1" Text="{Binding Path=Text.Length,ElementName=textBox,Mode=OneWay}" Width="240" Height="25" Grid.Row="3" Grid.Column="1" /></Grid><!--源的索引作Path--><Grid Background="Azure" Grid.Row="1" ><Grid.RowDefinitions><RowDefinition Height="1*" /><RowDefinition Height="1*" /><RowDefinition Height="1*" /><RowDefinition Height="1*" /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="1*"/><ColumnDefinition Width="2*"/></Grid.ColumnDefinitions><TextBlock Name="txtBlockPath2" Text="源的索引作Path" VerticalAlignment="Bottom" HorizontalAlignment="Center" Grid.ColumnSpan="2" Grid.Row="0" /><TextBlock Name="txtBlock2" Text="查看文本框字符串的第一個字符" Height="25" VerticalAlignment="Bottom" HorizontalAlignment="Center" Grid.ColumnSpan="2" Grid.Row="1" /><TextBlock Name="textBlockString1" Text="請輸入字符:" Height="25" Width="67" HorizontalAlignment="Right" Grid.Row="2" Grid.Column="0"/><TextBox Name="txtString1" Width="240" Height="25" Grid.Column="1" Grid.Row="2" /><TextBlock Name="textBlockStringLong1" Text="第一個字符為:" HorizontalAlignment="Right" Height="23" Grid.Row="3" Grid.Column="0"/><TextBox Name="txtFirstChar" Text="{Binding Path=Text.[0],ElementName=txtString1,Mode=OneWay}" Width="240" Height="25" Grid.Row="3" Grid.Column="1" /></Grid><!--默認元素當path--><Grid Background="Azure" Grid.Row="0" Grid.Column="1"><Grid.RowDefinitions><RowDefinition Height="1*" /><RowDefinition Height="1*" /><RowDefinition Height="1*" /><RowDefinition Height="1*" /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="1*"/><ColumnDefinition Width="2*"/></Grid.ColumnDefinitions><TextBlock Name="txtBlock3" Text="默認元素當path" Height="25" VerticalAlignment="Bottom" HorizontalAlignment="Center" Grid.ColumnSpan="2" Grid.Row="0" Grid.Column="1"/><TextBlock Name="textBlockString2" Text="名字:" Height="25" HorizontalAlignment="Right" Grid.Row="1" Grid.Column="0"/><TextBox Name="txtName" Width="240" Height="25" Grid.Column="1" Grid.Row="1" /><TextBlock Name="txtBlockSecondChar" Text="名字的第二個字符:" HorizontalAlignment="Right" Height="23" Grid.Row="2" Grid.Column="0"/><TextBox Name="txtSecondChar" Width="240" Height="25" Grid.Row="2" Grid.Column="1" /><TextBlock Name="textBlockStringLong3" Text="字符長度為:" HorizontalAlignment="Right" Height="23" Grid.Row="3" Grid.Column="0"/><TextBox Name="txtLength" Width="240" Height="25" Grid.Row="3" Grid.Column="1" /></Grid><!--多級默認元素當path--><Grid Background="Azure" Grid.Row="1" Grid.Column="1"><Grid.RowDefinitions><RowDefinition Height="1*" /><RowDefinition Height="1*" /><RowDefinition Height="1*" /><RowDefinition Height="1*" /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="1*"/><ColumnDefinition Width="2*"/></Grid.ColumnDefinitions><TextBlock Name="txtBlock4" Text="多級默認元素當path" Height="25" VerticalAlignment="Bottom" HorizontalAlignment="Center" Grid.ColumnSpan="2" Grid.Row="0" Grid.Column="1"/><TextBlock Name="textBlockCountry" Text="國家:" Height="25" HorizontalAlignment="Right" Grid.Row="1" Grid.Column="0"/><TextBox Name="txtCountry" Width="240" Height="25" Grid.Column="1" Grid.Row="1" /><TextBlock Name="txtBlockProvince" Text="省份:" HorizontalAlignment="Right" Height="23" Grid.Row="2" Grid.Column="0"/><TextBox Name="txtProvince" Width="240" Height="25" Grid.Row="2" Grid.Column="1" /><TextBlock Name="textBlockCity" Text="城市:" HorizontalAlignment="Right" Height="23" Grid.Row="3" Grid.Column="0"/><TextBox Name="txtCity" Width="240" Height="25" Grid.Row="3" Grid.Column="1" /></Grid></Grid> </Window> CS using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes;namespace Chapter_04 {/// <summary>/// Path.xaml 的交互邏輯/// </summary>public partial class Path : Window{public Path(){InitializeComponent();//后臺代碼綁定路徑為屬性或者索引(索引也可以理解為特殊的屬性),當綁定源本身就為string,int類型數據時//XAML中可以省略路徑,后臺代碼中用"."代替,注意與下面“/”的區別//string str = "123";//this.txtName.SetBinding(TextBox.TextProperty, new Binding(".") { Source = str });//this.txtLength.SetBinding(TextBox.TextProperty, new Binding("Length") { Source = str, Mode = BindingMode.OneWay });//this.txtSecondChar.SetBinding(TextBox.TextProperty, new Binding("[1]") { Source = str, Mode = BindingMode.OneWay });//讓一個集合或者是DataView的第一個元素作為binding的路徑。如果路徑是集合的話可以繼續"/"下去===============================List<string> strList = new List<string>() { "Tim", "Tom", "Blog" };this.txtName.SetBinding(TextBox.TextProperty, new Binding("/") { Source = strList });this.txtLength.SetBinding(TextBox.TextProperty, new Binding("/Length") { Source = strList, Mode = BindingMode.OneWay });this.txtSecondChar.SetBinding(TextBox.TextProperty, new Binding("/[1]") { Source = strList, Mode = BindingMode.OneWay });//實現多級默認集合作為binding的源=========================================================================================//定義一個國家列表List<Country> ListCountry = new List<Country>();//定義一個省份列表List<Province> ListProvince = new List<Province>();//定義一個城市列表List<City> ListCity1 = new List<City>();List<City> ListCity2 = new List<City>();//為城市列表中添加城市 ListCity1.Add(new City() { Name = "鄭州" });ListCity1.Add(new City() { Name = "許昌" });ListCity2.Add(new City() { Name = "福州" });ListCity2.Add(new City() { Name = "廈門" });//為省份列表添加省ListProvince.Add(new Province() { Name = "河南", CityList = ListCity1 });ListProvince.Add(new Province() { Name = "福建", CityList = ListCity2 });Country country = new Country() { Name = "中國", ProvinceList = ListProvince };ListCountry.Add(country);//當默認集合為對象的話,注意指明其屬性,注意與上面的區分this.txtCountry.SetBinding(TextBox.TextProperty, new Binding("/Name") { Source = ListCountry });this.txtProvince.SetBinding(TextBox.TextProperty, new Binding("/ProvinceList/Name") { Source = ListCountry });this.txtCity.SetBinding(TextBox.TextProperty, new Binding("/ProvinceList/CityList/Name") { Source = ListCountry });}}#region 創建國家、省份、城市類class City{public string Name { get; set; }}class Province{public string Name { get; set; }public List<City> CityList { get; set; }}class Country{public string Name { get; set; }public List<Province> ProvinceList { get; set; }}#endregion }

相對比較簡單,代碼里面含有注釋,如有疑問和不足的地方,歡迎留言。

2.3 為Binding指定源的方式

  Binding指定源的方式有多種,總的概括一句話:只要一個對象包含數據并能通過屬性把數據暴露出來,就能當做Banding的源。下面列出常用的方法:

  • 把CLR類型單個對象指定為Source,包括自帶的類型對象和用戶自定義的對象,必要時使用INotifyPropertyChanged接口。可以通過在屬性的set語句里激發PropertyChanged事件來通知Binding數據已經發生改變。
  • 把依賴對象指定為Source。一般情況依賴對象是用來作為Binding的目標的,如果是作為源的話,就形成了Binding鏈(源-目標(源)-目標)。
  • 把DataContext指定為Source,由于每個WPF控件都含有DataContext屬性,DataContext常用于:如果不能確定Binding從哪里獲取數據,只知道路徑Path的話,他就會一直沿著控件樹往根的方向找下去,從而找到含有Path的元素的DataContext作為源。
  • 把普通CLR集合類型對象指定為Source:包括數組、泛型等集合類型。一般是把控件的ItemsSource屬性使用Binding關聯到一個集合對象上。
  • 把ADO.NET數據對象指定為Source:包括DataTable和DataView等對象。
  • XmlDataProvider把XML數據指定為source,經常和TreeView和Menu結合著用(除了TreeView,還涉及到DataTemplate相關的內容,如果不理解的話,到“話模板“的時間在具體記錄)。
  • ObjectDataProvider對象指定為Source,當數據源的屬性不是通過屬性而是通過方法來暴露的話,就可以用ObjectDataProvider對象。
  • 通過Binding的RelativeSource屬性相對的指定Source,主要用于當控件想關注自己或者自己容器的以及自己內部元素的某個值就需要這個方法。

  由于前兩個已經使用過,下面就直接從第三個開始逐個介紹。

2.4使用DataContext作為Binding的源

  先重點記錄一下DataContext,DataContext是每一個繼承FrameworkElement類的控件都有的屬性,所以每一個UI控件都有此屬性(包括布局控件),Binding只知道Path不知道Source的話就會向UI樹的根部找過,直到找到含有Path所指定的屬性的對象然后“借過來”用一下,如果最終沒有找到那么就不會得到數據。為了初步認識一下DataContext,下面看一個例子:

<Window x:Class="Chapter_04.ContextSource"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:Chapter_04"Title="ContextSource" Height="150" Width="219"><StackPanel Background="Beige"><StackPanel.DataContext><local:Student Id="2008101132" Age="24" Name="李占朋"/></StackPanel.DataContext><Grid><StackPanel><TextBox Text="{Binding Path=Id}" Margin="5" BorderBrush="Black"/><TextBox Text="{Binding Path=Name}" Margin="5" BorderBrush="Black"/><TextBox Text="{Binding Path=Age}" Margin="5" BorderBrush="Black"/></StackPanel></Grid></StackPanel> </Window>

后臺代碼為:

CS XAML using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes;namespace Chapter_04 {/// <summary>/// ContextSource.xaml 的交互邏輯/// </summary>public partial class ContextSource : Window{public ContextSource(){InitializeComponent();}}public class Student{public int Id { get; set; }public int Age { get; set; }public string Name { get; set; }} }

效果圖為圖4:

?

??????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????

                    圖4                                           圖5

  在上面的例子中一個Student實例作為下面TextBox的綁定源。當然{Binding Path=Age}部分可以把"Path="省略掉即{Binding Age}。突然發現DataContext指定源是沒有Source的Binding。是否能和沒有path(當源為string或int類型時)的連用,如果可以,是怎么樣的效果呢?為了驗證沒有找到Source只是不顯示數據但是不會報錯,我還用上面的部分代碼(圖5為效果圖):

<Window x:Class="Chapter_04.ContextSource"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:sys="clr-namespace:System;assembly=mscorlib"xmlns:local="clr-namespace:Chapter_04"Title="ContextSource" Height="150" Width="219"><StackPanel Background="Beige"><StackPanel.DataContext><!--<local:Student Id="2008101132" Age="24" Name="李占朋"/>--><sys:String>紅色部分為沒有Path的測試!</sys:String></StackPanel.DataContext><Grid><StackPanel><TextBlock Text="{Binding}" Background="Red"/><TextBox Text="{Binding Path=Id}" Margin="5" BorderBrush="Black"/><TextBox Text="{Binding Path=Name}" Margin="5" BorderBrush="Black"/><TextBox Text="{Binding Path=Age}" Margin="5" BorderBrush="Black"/></StackPanel></Grid></StackPanel> </Window>

嘿嘿,既沒有指定Source有沒有指定path的Binding出現了。下面看一下控件是怎么借用DataContext的。

主要的XAML代碼為

<Grid DataContext="借用測試"><Grid><Grid><Grid><Button x:Name="btn" Content="Ok" Click="btn_Click"/></Grid></Grid></Grid></Grid>

點擊按鈕事件代碼為:

private void btn_Click(object sender, RoutedEventArgs e){MessageBox.Show(btn.DataContext.ToString());}

?點擊按鈕效果圖為圖6:

圖6

  到這里應該來說基本上認識了DataContext。而且從第一個例子中我們還可以看出:當UI上多個控件使用Binding關注同一個對象,可以使用DataContext作為Binding的源。其實DataContext還是一個依賴屬性,我們可以使用Binding把他關聯到一個數據源上(先記著有這么一回事,在以后的記錄中會詳細分析)。

?2.5? 集合類型對象指定列表控件的為ItemsSource

  前面的筆記中已經記錄了ItemsControl控件,應該有些熟悉了,它有個ItemsSource屬性,可以接受一個IEnumerable接口派生類的實例作為自己的值。我們現在想辦法把指定的Path

顯示在ListBox中,先實現單個屬性的實現,然后在實現多個屬性的顯示。單屬性顯示的代碼為:

XAML <Window x:Class="Chapter_04.ItemsSource"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="ItemsSource" Height="300" Width="300"><Grid Background="Beige"><TextBlock Text="所選學生的學號:"></TextBlock><TextBox x:Name="textBoxid" Margin="0,1,93,234" HorizontalAlignment="Right" Width="82"></TextBox><ListBox x:Name="listview" Margin="0,89,62,0" Background="Azure"><!--<ListBox.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Path=Id}" Width="30"/><TextBlock Text="{Binding Path=Name}" Width="30"/><TextBlock Text="{Binding Path=Age}" Width="30"/></StackPanel></DataTemplate></ListBox.ItemTemplate>--></ListBox><Button Content="添加學生" Height="23" HorizontalAlignment="Left" Margin="191,0,0,0" VerticalAlignment="Top" Width="75" Click="button1_Click" /></Grid> </Window> CS using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using System.Collections.ObjectModel;namespace Chapter_04 {/// <summary>/// ItemsSource.xaml 的交互邏輯/// </summary>public partial class ItemsSource : Window{//注意ObservableCollection與List的區別List<Student> stuList = new List<Student>() { new Student(){Id=0,Name="Tim",Age=19},new Student(){Id=1,Name="Tom",Age=29},new Student(){Id=2,Name="jim",Age=39},};public ItemsSource(){InitializeComponent();listview.ItemsSource = stuList;this.listview.DisplayMemberPath = "Name";Binding binding = new Binding("SelectedItem.Id") { Source = this.listview };this.textBoxid.SetBinding(TextBox.TextProperty, binding);}private void button1_Click(object sender, RoutedEventArgs e){this.stuList.Add(new Student() { Id = 2, Name = "jim", Age = 39 }); }} }

  在CS代碼中,我們看到了一句this.listview.DisplayMemberPath = "Name"中有一個DisplayMemberPath,這個就是指定綁定源的屬性。如果想顯示多個屬性,應該怎么做呢?答案是使用DataTemplate,因為在以后的筆記中還會記錄到DataTemplate,在此提出來知道有這么一回事就好了,接觸過webFrom的人或許會理解的更快點。具體的做法是把上面的XAML代碼中的注釋部分去掉,后臺代碼的this.listview.DisplayMemberPath = "Name";去掉就可以實現顯示多個屬性。除此之外我在UI上還放了一個Button,主要用來區別ObservableCollection<T>與List<T>,因為ObservableCollection<T>實現了INotifyColletionChanged和INotifyProperty接口,能把集合的變化立即顯示給控件。可以把后臺代碼的List用ObservableCollection替代,點擊按鈕查看兩者的區別(添加的條目會理解顯示出來,用list卻沒有這個效果)。

2.6?把ADO.NET數據對象指定為Source

  基本上和上面的用法相同,但是注意格式,特別是GridView的用法.

View Code <Window x:Class="Chapter_04.Ado"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Ado" Height="300" Width="400"><StackPanel><ListView x:Name="listView1"><ListView.View><GridView><GridViewColumn Header="學號" Width="60" DisplayMemberBinding="{Binding UserNo}"/><GridViewColumn Header="昵稱" Width="60" DisplayMemberBinding="{Binding UserName}"/><GridViewColumn Header="姓名" Width="60" DisplayMemberBinding="{Binding UserRealName}"/><GridViewColumn Header="郵箱" Width="120" DisplayMemberBinding="{Binding UserEmail}"/></GridView></ListView.View></ListView></StackPanel> </Window> CS View Code using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using System.Data;namespace Chapter_04 {/// <summary>/// Ado.xaml 的交互邏輯/// </summary>public partial class Ado : Window{public DataTable dt = null;public Ado(){IntiData();InitializeComponent();//this.listView1.ItemsSource = dt.DefaultView;this.listView1.DataContext = dt;this.listView1.SetBinding(ListView.ItemsSourceProperty,new Binding());}private void IntiData(){dt = new DataTable("T_User");dt.Columns.Add("UserNo", typeof(string));dt.Columns.Add("UserName", typeof(string));dt.Columns.Add("UserRealName", typeof(string));dt.Columns.Add("UserEmail", typeof(string));dt.Columns.Add("UserAddress", typeof(string));for (int i = 0; i < 10; i++){DataRow dr = dt.NewRow();dr["UserNo"] = "10000" + i.ToString();dr["UserName"] = "haiziguo";dr["UserRealName"] = "李占朋";dr["UserEmail"] = "lizhpeng@126.com";dt.Rows.Add(dr);}}} }

?

顯示結果如圖7:

?

圖7

  通過上面的一個演示,我們應該知道ListView和GridView不是同一級別的控件,GridView是作為ListView的View屬性的值,其中View和GridView都是屬于ViewBase類型對象。如果不是很理解的話,在模板筆記里面還會具體的記錄。還有個地方是"this.listView1.ItemsSource = dt.DefaultView;“DataTable是不能直接賦值給ItemsSource的,如果賦值可以用DefaultView屬性。把這一句取消注釋,然后注釋掉下面的兩行,可以看到相同的結果。

2.7 XmlDataProvider把XML數據指定為source

  XML是什么以及xml的用途,在此不作為重點,本文重點介紹怎么把XML綁定到UI控件中。?XmlDataProvider就是把XML數據作為數據源提供給Binding。下面實現一個需求,就是把XML的數據顯示在TreeViewItem里面。先給出XML文件,然后分別給出XAML和CS代碼:

XML <?xml version="1.0" encoding="utf-8" ?> <Department Name="公司部門"><Department Name="軟件組"><Department Name="Tom"/><Department Name="Tom1"/></Department><Department Name="客服組"><Department Name="Tim"/><Department Name="Tim1"/></Department> </Department> XAML <Window x:Class="Chapter_04.Source"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Source" Height="312" Width="1090"><StackPanel Orientation="Horizontal"><Grid Width="150"><TreeViewItem><TreeViewItem.Header>各個部門以及其成員</TreeViewItem.Header><TreeView x:Name="treeViewDepartment"><TreeView.ItemTemplate><HierarchicalDataTemplate ItemsSource="{Binding XPath=Department}"><TextBlock Text="{Binding XPath=@Name}"/></HierarchicalDataTemplate></TreeView.ItemTemplate></TreeView></TreeViewItem></Grid></StackPanel> </Window> CS using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes;namespace Chapter_04 {/// <summary>/// Source.xaml 的交互邏輯/// </summary>public partial class Source : Window{public Source(){InitializeComponent();XmlDataProvider xdp = new XmlDataProvider();xdp.Source = new Uri(@"E:\WPFCode\Chapter_04\Chapter_04\Department.xml");xdp.XPath = @"/Department";treeViewDepartment.DataContext = xdp;treeViewDepartment.SetBinding(TreeView.ItemsSourceProperty, new Binding());}} }

另外一種寫法思路是把XML文件當做資源,然后在前臺綁定:

View Code <Window x:Class="Chapter_04.Source"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Source" Height="312" Width="1090"><StackPanel Orientation="Horizontal"><Grid Width="150"><TreeViewItem><TreeViewItem.Header>各個部門以及其成員</TreeViewItem.Header><TreeView x:Name="treeViewDepartment" ItemsSource="{Binding Source={StaticResource ResourceKey=xmlDepartment}}"><TreeView.ItemTemplate><HierarchicalDataTemplate ItemsSource="{Binding XPath=Department}"><TextBlock Text="{Binding XPath=@Name}"/></HierarchicalDataTemplate></TreeView.ItemTemplate></TreeView></TreeViewItem></Grid></StackPanel> </Window> CS using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes;namespace Chapter_04 {/// <summary>/// Source.xaml 的交互邏輯/// </summary>public partial class Source : Window{public Source(){InitTreeView();InitializeComponent();}protected void InitTreeView(){XmlDataProvider xdp = new XmlDataProvider();xdp.Source = new Uri(@"E:\WPFCode\Chapter_04\Chapter_04\Department.xml");xdp.XPath = @"/Department";this.Resources.Add("xmlDepartment",xdp);}}}

效果圖為圖8:

?圖8

?  簡單的實現了讓XML的文件顯示到了TreeViewItem,但是美中不足的是這里用到了HierarchicalDataTemplate模板,不過作為一個參考吧,或者等到介紹完Template再回來看看也不錯。最后要注意的是:關于綁定的時間<TextBlock Text="{Binding XPath=@Name}"/>?里面加@表示Attribute,不加@的話表示子集元素。

?2.8 ObjectDataProvider對象指定為Source

  Binding的源不僅可以是通過XmlDataProvider提供的XML數據,還可以是ObjectDataProvider類提供的類的實例。XmlDataProvider與ObjectDataProvider都是繼承于抽象類DataSourceProvider。下面用個圖來解釋一下ObjectDataProvider對象,如圖9:

圖9

?  其中ObjectDataProvider對象的ObjectInstance屬性是類的實例化對象(Obj),MethodParamers屬性為Obj的方法,其中方法中還可以含有參數。最后返回結果為ObjectDataProvider對象的Data屬性。?這樣做的結果是更方便了程序員的分工,很簡單的就綁定了一個返回值。?下面實現一個加法的運算:

Calculator.cs using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace Chapter_04 {public class Calculator{public string Add(string arg1, string arg2){double x = 0; double y = 0; double z = 0;if (double.TryParse(arg1, out x) && double.TryParse(arg2, out y)){z = x + y;return z.ToString();}return "input Error";}} } XAML <Window x:Class="Chapter_04.ObjectDataProviderTest"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="ObjectDataProviderTest" Height="300" Width="300"><StackPanel Background="LightBlue"><TextBox Name="FristParam" Margin="5" ></TextBox><TextBox Name="SecondParam" Margin="5" ></TextBox><TextBox Name="Result" Margin="5"></TextBox></StackPanel> </Window> CS using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes;namespace Chapter_04 {/// <summary>/// ObjectDataProviderTest.xaml 的交互邏輯/// </summary>public partial class ObjectDataProviderTest : Window{public ObjectDataProviderTest(){InitializeComponent();SetBinding();}private void SetBinding(){ObjectDataProvider odp = new ObjectDataProvider();odp.ObjectInstance = new Calculator();odp.MethodName = "Add";odp.MethodParameters.Add("0");odp.MethodParameters.Add("0");//MessageBox.Show(odp.Data.ToString());Binding bindArg1 = new Binding("MethodParameters[0]"){Source = odp,//把UI元素收集到的元素直接賦給sourceBindsDirectlyToSource = true,//當目標更改時,立即設置新的源UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged};Binding bindArg2 = new Binding("MethodParameters[1]"){Source = odp,BindsDirectlyToSource = true,UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged};Binding bindingToResult = new Binding(".") { Source = odp };this.FristParam.SetBinding(TextBox.TextProperty, bindArg1);this.SecondParam.SetBinding(TextBox.TextProperty, bindArg2);this.Result.SetBinding(TextBox.TextProperty, bindingToResult);}} }

運行,如果在前兩個文本框里面填上數字,結果就會出現了;如圖10

圖10

  ObjectDataProvider對象作為綁定源還是很遵守“使用數據對象作為源,UI控件作為綁定對象”的原則,但是關于this.Result.SetBinding(TextBox.TextProperty,new Binding(".") { Source=odp});用“.”而不用“Data”來表示路徑,我不是很理解,如果有大牛知道的話,歡迎留言。?

?2.9 通過Binding的RelativeSource屬性相對的指定Source

  綁定的源不僅用"絕對"的對象,還可以用“相對”的作為源。例如有的時間我們需要顯示出上級的控件的寬度。需求是:將上級的第一個(從自身向上數起第一個)Grid的寬度顯示在TextBox里面,由于比較簡單,現在直接貼出代碼。  

XAML <Window x:Class="RelativeSounceOfBinding.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Grid x:Name="g1" Background="Red" Margin="10"><DockPanel x:Name="d1" Background="Orange" Margin="10"><Grid x:Name="g2" Background="Yellow" Margin="10" Width="300"><DockPanel x:Name="d2" Background="LawnGreen" Margin="10"><TextBox Name="textBox1" FontSize="24" Margin="10" Background="AliceBlue" /></DockPanel></Grid></DockPanel></Grid> </Window> CS using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes;namespace RelativeSounceOfBinding {/// <summary>/// MainWindow.xaml 的交互邏輯/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();RelativeSource rs = new RelativeSource();rs.AncestorLevel = 1;rs.AncestorType = typeof(Grid);Binding bind=new Binding("Width"){RelativeSource=rs};this.textBox1.SetBinding(TextBox.TextProperty, bind);}} }

效果圖如圖11:

圖11

RelativeSource rs = new RelativeSource();rs.AncestorLevel = 1;rs.AncestorType = typeof(Grid);

此處的源是RelativeSource類型的實例。AncestorLevel是指定向上查第幾個類型為AncestorType的控件。順便附上XAML實現的方法:

<TextBox Name="textBox1" FontSize="24" Margin="10" Background="AliceBlue" Text="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Grid},AncestorLevel=1},Path=Width}" />

三、總結

  由于綁定與模板聯系比較緊密,所以有的地方會用到模板,難免會有似懂非懂的感覺,不過等做完模板的筆記的話,再回來看,應該會慢慢的消化的。綁定在WPF中是比較重要的一章,在本文中僅僅是幾個記錄。鑒于文章寫的太長自己堅持不住寫,另一方面到時間復習的話也沒有耐心看,所以就把綁定分為兩篇去記錄,下一篇《深入淺出WPF》筆記——綁定篇(二)會記錄Binding對數據的轉化和校驗以及多路綁定。

轉載于:https://www.cnblogs.com/lzhp/archive/2012/09/11/2673810.html

總結

以上是生活随笔為你收集整理的《深入浅出WPF》笔记——绑定篇(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

91精品国产乱码在线观看 | 国产尤物一区二区三区 | 国产精选在线观看 | 婷婷在线不卡 | 国产精品99久久久精品免费观看 | 国产成人精品一区二三区 | 欧美一级片在线观看视频 | 香蕉视频在线视频 | 日韩视频在线观看免费 | 国产又粗又硬又长又爽的视频 | 国产色在线视频 | 欧美91在线 | 欧美日韩中文国产一区发布 | 黄色影院在线免费观看 | 九九热re| 最新一区二区三区 | 亚洲精品一区二区三区在线观看 | 密桃av在线 | 久久麻豆视频 | 免费在线 | 久久激情影院 | 视频成人免费 | 国产精品综合av一区二区国产馆 | 国产区免费在线 | 91九色蝌蚪国产 | 99视频在线免费观看 | 中文字幕在线播放一区 | avove黑丝 | 免费合欢视频成人app | 久久8精品 | 日韩va在线观看 | 国产伦精品一区二区三区… | 91看片麻豆 | 久久手机在线视频 | 亚洲精品18日本一区app | 国产午夜亚洲精品 | 国产精品手机在线观看 | 久草电影免费在线观看 | av免费在线观看1 | 99精品欧美一区二区三区 | 亚洲人成人在线 | 色噜噜在线观看视频 | 亚洲欧洲日韩在线观看 | 日韩在线观看一区二区三区 | 国产小视频91 | 欧美一级淫片videoshd | 日韩在线高清免费视频 | 国产日产欧美在线观看 | a午夜电影 | 97在线视频网站 | 美女免费电影 | 色综合久久精品 | 51精品国自产在线 | 日韩国产欧美在线视频 | 亚洲三级国产 | 日本精品久久久久影院 | 黄色看片 | 狠狠狠干狠狠 | 成人av一区二区兰花在线播放 | 五月激情站| 亚洲一区二区精品在线 | 免费观看91视频大全 | 欧美成人h版电影 | 五月天激情电影 | 久久久久久久免费 | 日韩大片在线免费观看 | 日韩肉感妇bbwbbwbbw | 黄色在线成人 | 久久久免费毛片 | 视频一区视频二区在线观看 | av综合网址| 色91在线| 精品国产1区二区 | 久久a v视频 | 色综合久久99 | 中文字幕日韩伦理 | 国产自产在线视频 | 国产 欧美 日本 | 日韩精品不卡 | 六月婷婷色 | 色婷婷 亚洲 | 欧美一级黄色片 | 久久一区91 | jizz欧美性9 国产一区高清在线观看 | 91影视成人 | 日韩av专区| 九九热免费在线视频 | 免费观看久久久 | 一级黄色片在线免费看 | 国产91区 | 久久99视频| 亚洲视频一区二区三区在线观看 | 中文字幕免费高 | 成年人免费在线观看网站 | 国产91精品在线播放 | 美女免费视频一区二区 | 国产真实在线 | 国产美女精品久久久 | 又黄又刺激又爽的视频 | 麻豆首页 | 一本一道波多野毛片中文在线 | 欧美精品久久久久久久久久 | 国产视频久久久久 | 中文字幕国产在线 | 日韩一区二区三区免费视频 | 亚洲精品免费在线 | 西西www444 | 精品国产乱码久久久久久1区2匹 | 亚洲乱码精品 | 国产剧情一区二区在线观看 | 三级黄色三级 | 超碰在线观看av | 欧美在线日韩在线 | 特级毛片网站 | 婷婷久久一区二区三区 | 天天综合网在线 | 国产精品资源在线观看 | 伊人影院得得 | 婷婷社区五月天 | 日韩av电影网站在线观看 | 中文不卡视频在线 | 久久大视频 | 欧美日韩国产二区 | 免费观看日韩av | av高清在线 | 亚洲免费av在线播放 | 美女网站在线观看 | 久久一久久 | 久久久久久久久久久免费 | 国产精品成人av电影 | 久久久国产精品一区二区三区 | 中文字幕在线看 | 免费看毛片在线 | 91av在线看 | 国产成人一区二区三区影院在线 | 草莓视频在线观看免费观看 | 久久伊人爱 | 久久久一本精品99久久精品 | 国产精品视频最多的网站 | 免费看av片网站 | 天堂网一区二区三区 | 99视频精品视频高清免费 | 午夜视频在线网站 | 黄色的视频网站 | 黄色三级网站在线观看 | 久久天天躁狠狠躁亚洲综合公司 | 色干综合| av在线播放国产 | 热久久精品在线 | 国产精品欧美在线 | 菠萝菠萝蜜在线播放 | 500部大龄熟乱视频使用方法 | 成年人免费电影在线观看 | 精品av在线播放 | 日本字幕网 | 91资源在线播放 | 96久久欧美麻豆网站 | 国产一线二线三线在线观看 | 久久无码av一区二区三区电影网 | 久久1区 | 色综合久久久久综合体桃花网 | 99日精品 | 国产系列精品av | 国产麻豆果冻传媒在线观看 | 久草在线视频免费资源观看 | 欧美视频国产视频 | 久草网站在线观看 | 国产乱老熟视频网88av | 91中文在线观看 | 日韩,精品电影 | 免费看黄色大全 | 欧美在线视频一区二区 | 91精品看片| 91最新地址永久入口 | 国产一级电影在线 | 国产精品一区在线 | 日韩精品在线视频 | 伊人色播 | 午夜精品一区二区三区在线观看 | 日韩在线观看第一页 | 麻豆视频观看 | 在线观看日韩精品视频 | 欧美亚洲一区二区在线 | 久久不见久久见免费影院 | 久久综合影音 | 日韩欧美在线观看一区二区 | 性色av一区二区三区在线观看 | 国产999精品久久久久久麻豆 | 天天草天天插 | 欧美日韩在线看 | 日本精品久久久久 | 四虎在线免费视频 | 久久综合久久综合这里只有精品 | 成人在线观看资源 | 在线观看a视频 | 欧美一级乱黄 | 黄色福利网 | 99久久99久久精品 | 精品久久久久久久久久久久久久久久 | 成人免费在线视频 | 中文字幕在线看视频 | 国产视频 亚洲视频 | 美女性爽视频国产免费app | 99国产精品视频免费观看一公开 | 九九热在线精品视频 | 国产免费一区二区三区最新 | 久久精品国产成人精品 | 久久夜夜操 | av免费黄色 | 色婷婷免费 | 国产小视频网站 | 激情在线网址 | 黄色性av| 国产精品美女久久久免费 | 国产剧情一区二区在线观看 | 四虎永久国产精品 | av免费看电影| 日韩午夜在线 | 狠狠躁天天躁 | 国产成人免费在线 | 亚洲免费公开视频 | 欧美一区二区免费在线观看 | 日本黄色免费大片 | 国产精品午夜久久久久久99热 | 国产亚洲精品久久久久动 | 久久久久免费精品国产小说色大师 | 久久久久久久久毛片 | 国产午夜三级一二三区 | 91精品999 | 国产成人久久77777精品 | 午夜91视频 | 国产精品资源在线 | 成 人 黄 色 视频 免费观看 | 精品999 | 日韩乱理| 激情开心色 | 国产小视频在线观看 | 在线观看黄色国产 | 日日草av| 国产69精品久久久久久 | 黄网在线免费观看 | 国产一区二区高清不卡 | 五月激情视频 | 亚洲年轻女教师毛茸茸 | 亚洲欧美日韩一区二区三区在线观看 | 日韩一区二区三区高清在线观看 | 国产精品露脸在线 | 国产午夜三级一二三区 | av 一区二区三区四区 | 天天草天天草 | 久久er99热精品一区二区三区 | 国产在线更新 | 日韩中文字幕亚洲一区二区va在线 | 欧美夫妻性生活电影 | 在线看片a| 免费久久网站 | 97精品在线 | 黄色成品视频 | 超碰免费av | 91在线网站| 欧美精品一区二区三区一线天视频 | 色综合激情久久 | 99精品国产兔费观看久久99 | 色综合 久久精品 | 国产精品毛片 | 精品国产精品一区二区夜夜嗨 | 久久情网 | 亚洲影视九九影院在线观看 | 亚洲精品九九 | www.com黄色| 最近最新中文字幕 | 九九热久久免费视频 | 三级在线国产 | 日韩在线一级 | 亚洲国产精品一区二区久久hs | 亚洲人成人天堂h久久 | 亚洲开心激情 | 81精品国产乱码久久久久久 | 亚洲成人资源在线观看 | 91麻豆精品久久久久久 | 色亚洲网 | 日韩精品免费一线在线观看 | 久久成人资源 | 国产123区在线观看 国产精品麻豆91 | 中文字幕在线第一页 | 亚洲精品乱码久久久久久蜜桃动漫 | 最新日韩电影 | 人人插人人做 | 精品国产色 | av五月婷婷 | 人人藻人人澡人人爽 | 97成人资源 | 亚洲涩综合| 精品福利视频在线 | www好男人 | 日韩理论片在线 | 色干综合 | 免费日韩av电影 | 色99中文字幕 | 激情五月综合网 | 一区二区三区免费 | 国产成人精品久久二区二区 | 婷婷精品国产一区二区三区日韩 | 久久免费视频在线 | 色综合久久网 | 色婷婷免费| av在线播放中文字幕 | 国产精品 日韩 | 六月丁香色婷婷 | 色综合色综合色综合 | 久久黄色片子 | 国产一级片免费播放 | 91麻豆高清视频 | 日韩精品一区二区三区水蜜桃 | 久久国产精品第一页 | 99视频网址 | 国产成人一区二 | 日韩一区二区免费视频 | 亚洲精品人人 | 久久96国产精品久久99软件 | 精品福利视频在线观看 | 日韩久久视频 | 福利视频入口 | 97超碰资源 | 国产特级毛片aaaaaaa高清 | 国产一区91 | 美女av免费看 | 91成人免费看 | 国产一区影院 | 久久精品久久综合 | 精品视频免费看 | 国产精品v欧美精品v日韩 | 国模视频一区二区三区 | 97夜夜澡人人爽人人免费 | 91桃色在线观看视频 | 精品乱码一区二区三四区 | 久久久久精 | 久久久久欠精品国产毛片国产毛生 | 99热最新在线 | 精品国产免费看 | av超碰在线 | 亚洲精品免费在线观看视频 | 天天操月月操 | 97电影在线看视频 | 亚洲国产成人精品久久 | 欧美精品久久久久久久久久白贞 | 天天曰天天射 | 麻豆系列在线观看 | av电影中文 | 亚洲日本在线视频观看 | 国产精品系列在线观看 | 91精品在线播放 | 九九热久久免费视频 | 国产日韩中文字幕在线 | 国产精品久久久久aaaa | 中文字幕在线观看你懂的 | 色婷婷激情五月 | 99日精品 | 91av在线免费视频 | 日本久久久久久科技有限公司 | 久久久96| 日韩videos| 国产成人在线免费观看 | 91九色视频在线观看 | 奇米7777狠狠狠琪琪视频 | 中国精品少妇 | 亚洲专区中文字幕 | 久久天堂精品视频 | 国产精品毛片一区二区三区 | 久久综合久色欧美综合狠狠 | 97国产精品| 欧美日韩久久不卡 | 日韩在线视频看看 | 五月花丁香婷婷 | 最近中文字幕高清字幕免费mv | 久久久www成人免费毛片 | 黄色片网站av | 黄色小说视频在线 | 欧美日韩高清一区二区 国产亚洲免费看 | av国产在线观看 | 久久99精品国产 | 亚洲综合在线一区二区三区 | 麻豆91网站| 狠狠干夜夜操 | 国产精品99久久久久久久久久久久 | 亚洲性xxxx| 黄色小说18 | 日本女人的性生活视频 | 国内成人精品2018免费看 | 色婷婷综合久久久久 | 欧美婷婷色 | 日韩精品黄 | 永久免费看av | 天天干,天天干 | 福利视频入口 | 精品v亚洲v欧美v高清v | 日本三级国产 | 在线观看国产永久免费视频 | 欧美精品网站 | 97在线观看视频免费 | 婷婷精品国产欧美精品亚洲人人爽 | 日韩在线资源 | 久久精品小视频 | 视频在线播放国产 | 成人小视频在线免费观看 | 日本公妇色中文字幕 | 操少妇视频 | 欧美日韩另类视频 | 91网免费看| 日韩综合视频在线观看 | 久草在线久 | 亚洲国产视频直播 | 日本中文字幕在线播放 | 亚洲区另类春色综合小说校园片 | 日韩三级视频在线观看 | 免费视频 三区 | 日本高清dvd | 国产精品原创在线 | 欧美资源在线观看 | 四虎国产精品成人免费影视 | 在线观看岛国av | 亚洲欧洲视频 | 亚洲精品777 | 久久久久综合视频 | 日韩精品中文字幕av | 色先锋av资源中文字幕 | 18国产精品白浆在线观看免费 | 中文字幕观看在线 | 91香蕉视频720p | 日韩特级片 | 国产91精品一区二区麻豆网站 | 在线观看亚洲免费视频 | 视频二区在线视频 | 午夜性盈盈 | 久久网站最新地址 | 伊人热 | 久久精品国产免费看久久精品 | 2019中文在线观看 | 黄色三级视频片 | 日日爱视频 | 久久久激情视频 | 久久久久久蜜桃一区二区 | 久久婷婷一区二区三区 | 国产成人精品一区二区三区免费 | 国产亚洲情侣一区二区无 | 天天摸日日摸人人看 | 国产精品亚洲视频 | 狠狠干中文字幕 | 亚洲国产精品一区二区久久,亚洲午夜 | 97超碰资源总站 | 国产在线高清 | 免费看黄20分钟 | 天天干天天操天天 | 狠狠狠狠狠狠干 | www.夜夜草| 西西大胆免费视频 | 亚洲va韩国va欧美va精四季 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 天天爽人人爽夜夜爽 | 超碰在线国产 | 亚洲春色综合另类校园电影 | 日韩中文字幕免费视频 | 国产高清一区二区 | av在线免费观看黄 | 国产精品美女久久久久久免费 | 黄色免费网战 | 一区二区伦理 | av在线免费播放网站 | 97国产大学生情侣白嫩酒店 | 亚洲欧美国产精品久久久久 | 国产精品久久久久av | 国产精品国产三级国产不产一地 | 日本黄色大片免费看 | 精品a级片 | 久久久午夜精品福利内容 | 狠狠插狠狠干 | 日韩二区在线观看 | 亚洲精品美女久久久久网站 | 日韩综合精品 | 97超碰成人在线 | 久久高清免费 | 在线中文字幕播放 | 亚洲免费av电影 | 亚洲久草在线视频 | 久久久国产精品网站 | 成年人在线免费看 | 麻豆精品国产传媒 | 911国产在线观看 | 国产色视频一区二区三区qq号 | 亚洲美女视频在线 | av福利在线播放 | 亚洲综合网| 国产成人福利在线 | 婷婷精品国产一区二区三区日韩 | 日本在线观看一区二区 | 亚洲成人av片 | 天堂在线成人 | 婷婷伊人综合亚洲综合网 | 国产精品久久久久久久久久久久午夜 | 欧美久久久久久久久久久久 | 精品一区二区三区在线播放 | 国产电影黄色av | 日韩网页 | 91在线视频网址 | 国产精品人成电影在线观看 | 成人在线视频免费看 | 亚洲精品资源在线观看 | 久久少妇av | 色综合网 | 国产成人av免费在线观看 | 欧美一区日韩精品 | 91精品视频免费看 | 国内亚洲精品 | 97视频免费在线观看 | 91精品久久香蕉国产线看观看 | 成人av高清 | 欧美a级一区二区 | 视频91在线 | 日日操网 | 午夜精品久久久久久久久久久久久久 | 国内精品久久久久久久影视简单 | 亚洲女在线 | 夜夜摸夜夜爽 | 日本久久电影网 | 玖操| 在线免费观看av网站 | 亚洲精品网站在线 | 日韩欧美视频免费看 | 伊人手机在线 | 日日干影院| 九色porny真实丨国产18 | 天天操天天操天天 | 91一区在线观看 | www.午夜视频| 99 色| 狠狠色丁香 | 国产不卡在线 | 久久午夜精品影院一区 | 日韩欧美一区二区在线观看 | 国产免费一区二区三区网站免费 | www.91成人| 免费观看一区二区三区视频 | 成人三级网站在线观看 | 精品国产诱惑 | 亚洲欧美视频 | 美女网站在线免费观看 | 91麻豆精品国产91久久久使用方法 | 免费在线观看中文字幕 | 国产黄色精品在线观看 | 国产精品一区二区久久国产 | 97国产大学生情侣白嫩酒店 | 香蕉影院在线播放 | 国产精品午夜在线观看 | 亚洲精品久久久久久久蜜桃 | 久久中国精品 | 操操操天天操 | 亚洲精品视频 | 福利av影院 | 亚洲欧美在线视频免费 | 日本爱爱片| 午夜精品一区二区三区视频免费看 | 日本中文一级片 | 在线天堂中文在线资源网 | 欧美精品二 | 91麻豆精品国产91久久久久 | 久久超碰网 | 激情五月在线视频 | 欧美91精品久久久久国产性生爱 | 久草网首页 | 六月激情婷婷 | 国产美腿白丝袜足在线av | 欧美 亚洲 另类 激情 另类 | 婷五月激情 | 国产乱对白刺激视频在线观看女王 | 在线观看亚洲精品 | 国产99一区视频免费 | 欧美一二三区播放 | 麻豆国产露脸在线观看 | 日韩精品一区二区三区第95 | 欧美aa在线 | 99久久精品久久久久久清纯 | 精品久久精品久久 | 久久精品aaa| 久久精品资源 | 亚洲视频aaa| 日韩中文字幕免费在线播放 | 久久私人影院 | 日韩午夜精品福利 | 国产麻豆成人传媒免费观看 | 亚洲国产片色 | 成+人+色综合 | 国产精品乱码在线 | 99国产精品视频免费观看一公开 | 久久久三级视频 | 超碰人人在线观看 | 国产精品门事件 | 337p日本欧洲亚洲大胆裸体艺术 | 97精品伊人 | 日韩簧片在线观看 | 国产免费高清视频 | 8x成人在线 | www.国产在线 | av在线免费不卡 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 国偷自产中文字幕亚洲手机在线 | 色国产精品 | 97超碰超碰久久福利超碰 | 免费看搞黄视频网站 | 国产精品男女视频 | 久草观看| 在线观看亚洲精品视频 | 探花视频网站 | 人人爽久久涩噜噜噜网站 | 在线91播放| 久草久视频 | 手机成人免费视频 | 91亚洲精品视频 | 果冻av在线| 婷婷丁香在线视频 | 亚州av一区 | 美女久久久久久久久久 | 国产色爽| 色在线高清 | 91九色视频观看 | 波多野结衣在线视频一区 | 在线免费视 | 日本婷婷色 | 国产无套一区二区三区久久 | 日韩精品在线一区 | 欧美日韩一区二区三区视频 | 午夜国产一区 | 91麻豆精品国产91久久久使用方法 | 精品国产免费观看 | 国产中文字幕亚洲 | 亚洲黄色在线观看 | 亚洲精品高清视频在线观看 | 国产精品午夜8888 | 亚洲黄色在线免费观看 | 亚洲欧洲精品视频 | 久久在线免费视频 | 亚洲精品国产精品乱码不99热 | 天天操天天谢 | 中文字幕 国产视频 | 欧美小视频在线观看 | 精品亚洲免费视频 | 麻豆一精品传二传媒短视频 | 中文字幕在线免费观看视频 | 亚洲视频久久 | 久久激情视频 久久 | 欧美精品三级 | 91av在线免费 | 久久精品4 | 亚洲最大免费成人网 | 午夜丰满寂寞少妇精品 | av千婊在线免费观看 | 岛国大片免费视频 | 九九精品在线观看 | 日本三级久久久 | 999精品 | av千婊在线免费观看 | 亚洲三级av| 日韩有码中文字幕在线 | 麻豆一二| 亚洲免费黄色 | 麻豆91精品视频 | 婷婷久久久久 | 国产亚洲精品久久久久久无几年桃 | 国产主播大尺度精品福利免费 | 精品视频久久久 | 亚洲色视频 | 欧美日韩免费看 | 国产高清在线看 | 日本黄色一级电影 | 日韩av在线小说 | 亚洲色综合 | 国产一卡二卡在线 | 日本黄色一级电影 | 色偷偷男人的天堂av | 国产精品久久久久久99 | 亚洲激情小视频 | 日本三级不卡 | 综合铜03| 国产91全国探花系列在线播放 | 日本中文在线播放 | 91禁看片 | 国产资源精品 | 五月婷视频 | 亚洲乱码一区 | 国产精品久久久久久99 | 99视频网站| 国产精品久久久久久久久搜平片 | 国产精品露脸在线 | 免费a v网站| 最新av电影网址 | 最近中文字幕完整高清 | 中文不卡视频 | 亚洲成色777777在线观看影院 | 九九九视频在线 | 久久精品亚洲精品国产欧美 | 国产精品麻豆欧美日韩ww | 麻豆精品视频 | 欧美精品久久久久久久 | 六月婷操 | 激情欧美一区二区三区 | 婷婷丁香九月 | 中文字幕4| 人人插人人艹 | 激情伊人五月天 | 亚洲精品综合在线 | 欧美成人一二区 | 中文日韩在线视频 | 友田真希x88av | 青春草国产视频 | 久久av一区二区三区亚洲 | 波多野结衣久久精品 | 中日韩三级视频 | 天天做日日爱夜夜爽 | 欧美激情在线网站 | 国产成人a v电影 | 99久久精品免费看国产免费软件 | 久久久这里有精品 | 看国产黄色片 | 日韩视频a | 欧美日韩中文字幕视频 | 国精产品满18岁在线 | 午夜免费在线观看 | 在线观看国产高清视频 | 亚洲精品小视频 | 国产精品久久久久免费 | 超碰97久久| 一区二区三区三区在线 | 最新色站| 色婷婷骚婷婷 | 99色网站 | 精品国产乱码久久久久久1区2匹 | 中文字幕资源在线观看 | 国产 字幕 制服 中文 在线 | va视频在线 | 国产免费一区二区三区网站免费 | 日本高清免费中文字幕 | 精品国产自在精品国产精野外直播 | 日韩高清在线看 | 国产剧情一区二区在线观看 | 精品福利国产 | 视频一区二区在线 | 亚洲狠狠丁香婷婷综合久久久 | 天天操操操操操 | 色激情在线 | 成人av手机在线 | 五月天视频网站 | 久久99精品久久久久婷婷 | 欧美亚洲成人免费 | 中文字幕人成人 | 91插插插免费视频 | 欧美日韩国产精品一区二区亚洲 | 国产无限资源在线观看 | 开心激情五月网 | 99久久精品久久久久久动态片 | 四虎影视8848dvd | 91精品久| 日韩a欧美 | 国产一区二区不卡在线 | 精品视频在线视频 | 久久久久国产免费免费 | 成人一区影院 | 国产精品丝袜在线 | 亚洲精品午夜久久久 | 九九欧美 | 国产粉嫩在线 | 在线观看 国产 | 久久成人亚洲欧美电影 | 日日夜夜天天干 | 97精品国自产拍在线观看 | 国产精品理论片在线观看 | 国产日女人 | 久久久性 | www五月天com| www.天天射.com| 久久久69| 4438全国亚洲精品观看视频 | 在线视频 精品 | 不卡的av在线 | 在线只有精品 | 欧美精品在线免费 | 久久久久黄| 日韩美精品视频 | 国产精品ⅴa有声小说 | 国产亚洲精品久久久久秋 | 91精彩视频在线观看 | 欧美在线aa | 国产网红在线观看 | 国产成人久久av977小说 | 免费看污网站 | 成年人黄色大片在线 | 91精品视频免费 | 久久99精品热在线观看 | 日本黄色免费在线 | 免费视频在线观看网站 | 亚洲国产精品va在线看 | av片中文| av成人在线看 | 美女av电影 | 99免费观看视频 | 免费的黄色av | 啪啪小视频网站 | 日本公乱妇视频 | 成年人免费看片 | 亚洲在线视频网站 | 亚洲国产99| 国产在线一区二区三区播放 | 国内亚洲精品 | 国产精品福利一区 | 亚洲成a人片77777潘金莲 | 免费看v片网站 | 成人在线播放免费观看 | 免费三级在线 | 久草在线最新 | 婷婷丁香在线 | 欧美性黄网官网 | 久久99中文字幕 | 日韩在线免费观看视频 | 亚洲午夜av电影 | 亚洲aⅴ久久精品 | 国产午夜三级一区二区三 | 天天天操天天天干 | 精品一区二区在线观看 | 香蕉视频日本 | 久久久精品视频成人 | av怡红院| 免费看片网站91 | 人人干在线 | 成人免费在线观看入口 | 99久久精品久久亚洲精品 | 高潮久久久 | 国产一级免费在线观看 | 色婷婷www | 亚洲综合五月天 | 综合色亚洲 | 国产一区二区午夜 | 中文字幕在线观看播放 | 亚洲天天摸日日摸天天欢 | 亚洲人av免费网站 | 久久艹艹 | 国产电影黄色av | 中文字幕第一页在线vr | 欧美视频www | 五月天欧美精品 | 夜色.com | 国产视频手机在线 | 人人澡人人添人人爽一区二区 | 欧美在线日韩在线 | 久久首页 | 日韩中文字幕网站 | 伊人久久电影网 | 91亚洲精品视频 | 一级黄色片在线免费看 | 中文字幕视频一区二区 | 日本精品视频在线播放 | 国产精品久久久久久99 | 黄色一级动作片 | 毛片基地黄久久久久久天堂 | 欧美日韩国产一区二区三区 | 国产视频97 | 日本黄色免费大片 | 91九色蝌蚪视频网站 | 欧美午夜寂寞影院 | 欧美日韩在线网站 | 国产欧美精品xxxx另类 | 日韩精品久久久久久久电影99爱 | 免费观看黄色av | 久久久久久国产精品久久 | 国产成人99久久亚洲综合精品 | 98超碰人人 | 色爱区综合激月婷婷 | 丁香六月婷婷激情 | 99精品国产高清在线观看 | 亚洲精品国偷拍自产在线观看 | 美女黄濒 | 成人午夜网 | 国产一级在线播放 | 亚洲欧美观看 | 六月天综合网 | 国产91亚洲 | 人人超碰在线 | 国产色视频一区 | 最近能播放的中文字幕 | 国产精品成人自产拍在线观看 | 天堂av在线网 | 在线观看你懂的网站 | 欧美日韩精品在线一区二区 | 97国产在线视频 | 日日日爽爽爽 | 日日摸日日 | 中文字幕高清有码 | 婷婷色五 | 精品久久久久一区二区国产 | 99热国产在线观看 | 91在线免费看片 | 天天撸夜夜操 | 日韩综合一区二区三区 | 欧美精彩视频在线观看 | 黄网站色成年免费观看 | 欧美日本不卡视频 | 日韩精品电影在线播放 | 国产剧情在线一区 | 狠狠色丁香婷婷综合橹88 | 97人人爽人人 | 久久激情视频 久久 | 天天综合网 天天综合色 | 500部大龄熟乱视频使用方法 | a极黄色片 | www五月天婷婷 | 亚洲日韩欧美一区二区在线 | 欧美日韩精品影院 | 在线免费看黄网站 | 麻豆影视在线免费观看 | 在线午夜 | 国产一级黄色免费看 | 99精品国产一区二区 | 在线观看免费黄视频 | 亚洲精品天天 | 日韩一区视频在线 | 看全黄大色黄大片 | 黄色avwww| 国产不卡高清 | 色在线最新 | 操操操操网 | 99精品福利视频 | 成人免费看视频 | 久久你懂的| av中文资源在线 | 亚洲精品在线观看免费 | 99国产视频 | 超碰在线人人草 | 免费三级av | 欧美久久久久久久久中文字幕 | 国产日韩在线看 | 欧美 日韩 视频 | 久久综合久久久 | 精品在线观看一区二区三区 | 国产五月天婷婷 | 99色视频 | 日本中文字幕电影在线免费观看 | 久久少妇免费视频 | 热久久精品在线 | 成人午夜剧场在线观看 | 免费av观看 | 日韩大片在线观看 | 五月天亚洲综合 | 亚洲久在线 | 欧美日韩免费在线观看视频 | 乱男乱女www7788 | 超碰97中文 | 亚洲电影毛片 | 精品久久五月天 | 天天爱天天操天天射 | 99欧美| 五月天婷婷免费视频 | .国产精品成人自产拍在线观看6 | 视频91| 在线精品视频在线观看高清 | 美女黄网站视频免费 | 黄色一区三区 | 欧美日韩大片在线观看 | 中文区中文字幕免费看 | 国产亚洲精品女人久久久久久 | 国产成人精品免费在线观看 | 国产精品第三页 | 成人av网址大全 | 亚洲国产精品成人女人久久 | 亚洲专区欧美 | 国产在线免费 | 精品国产电影 | 国产精品毛片 | 欧美在线视频不卡 | 97在线免费视频 | 91精品国产91 | 亚洲精选在线观看 | 欧美综合色 | 久久黄色精品视频 | 久久免费电影网 | 91看成人 | av一级片 | 久久成人午夜视频 | 97视频在线免费播放 | 国产精品久久久久影院 | 超碰在线最新地址 | 久久人人爽爽人人爽人人片av | 日韩成人免费在线观看 | 国产免费一区二区三区最新6 | 国产午夜精品一区 | 欧美日韩在线观看一区二区 | 九九热在线精品 | 免费视频久久久久久久 | 五月婷婷影院 | 日韩在线无 | 久久一线| 天天综合中文 |