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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows App开发之集合控件与数据绑定

發布時間:2025/4/16 windows 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows App开发之集合控件与数据绑定 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為ListView和GridView添加數據

ListView采用垂直堆疊得方式顯示數據,而GridView則采用水平堆疊得方式。

長相的話嘛,它們都差不多。

<Grid Name="grid1" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><ListView x:Name="listView1" SelectionChanged="listView1_SelectionChanged"><x:String>Item 1</x:String><x:String>Item 2</x:String></ListView><GridView x:Name="gridView1" SelectionChanged="gridView1_SelectionChanged"><x:String>Item 1</x:String><x:String>Item 2</x:String></GridView></Grid>

當然,也可以在后臺代碼上添加。我只是為了將它們放在一起比較而已,這些代碼堆一起肯定是很丑的。

ListView listView1 = new ListView(); listView1.Items.Add("Item 1"); listView1.Items.Add("Item 2"); listView1.Items.Add("Item 3"); listView1.SelectionChanged += listView1_SelectionChanged; grid1.Children.Add(listView1); GridView gridView1 = new GridView(); gridView1.Items.Add("Item 1"); gridView1.Items.Add("Item 2"); gridView1.SelectionChanged += gridView1_SelectionChanged; grid1.Children.Add(gridView1);

如果只是像上面這樣來添加內容會不會比較麻煩呢,我們也可以把這些Item 1、Item 2之類的全部放在List中。

List<String> itemsList = new List<string>(); itemsList.Add("Item 1"); itemsList.Add("Item 2");ListView listView1 = new ListView(); listView1.ItemsSource = itemsList; listView1.SelectionChanged += listView1_SelectionChanged;grid1.Children.Add(listView1);

這樣一來所顯示的ListView就是兩行,非常簡陋,完全不能夠滿足要求。那么我們可以用它的ItemTemplate屬性來再里面添加一些東西,如下所示,我們可以在Grid中寫一個Image綁定頭像,用TextBlock綁定用戶的ID,再來一個TextBlock綁定用戶的消息,還可以來寫邊框呀什么的。而這些亂七八糟的Binding之類的,以后我們也會一起講的哦,現在只要它們是數據綁定就好。

<Page.Resources><CollectionViewSource x:Name="collectionVS" Source="{Binding Items}"/> </Page.Resources><Grid Name="grid1" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><ListView x:Name="listView1" ItemsSource="{Binding Source={StaticResource collectionVS}}"SelectionChanged="listView1_SelectionChanged"><ListView.ItemTemplate><DataTemplate><Grid></Grid></DataTemplate></ListView.ItemTemplate></ListView> </Grid>

還可以像下面這樣哦,通過WrapGrid來決定這些Item的擺放方式。

<Grid Name="grid1" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><ListView VerticalAlignment="Bottom"><ListView.ItemsPanel><ItemsPanelTemplate><WrapGrid Orientation="Vertical" MaximumRowsOrColumns="2"/></ItemsPanelTemplate></ListView.ItemsPanel><Rectangle Height="100" Width="100" Fill="Wheat" /><Rectangle Height="100" Width="100" Fill="White" /><Rectangle Height="100" Width="100" Fill="Gainsboro" /><Rectangle Height="100" Width="100" Fill="Violet" /><Rectangle Height="100" Width="100" Fill="DarkBlue" /><Rectangle Height="100" Width="100" Fill="RosyBrown" /><Rectangle Height="100" Width="100" Fill="SaddleBrown" /><Rectangle Height="100" Width="100" Fill="AliceBlue" /><Rectangle Height="100" Width="100" Fill="Fuchsia" /><Rectangle Height="100" Width="100" Fill="Aqua" /><Rectangle Height="100" Width="100" Fill="Tan" /></ListView> </Grid>

當然啦,對于ListView和GridView而言,知道用戶選擇了哪一項是很重要的。SelectionMode屬性決定了ListView和GridView的選擇模式:單個、多個、無、擴展。

下面這個函數將選擇的項給了selectedItems啦。我們還可以通過IsItemClickEnabled來啟用ListView和GridView的點擊事件,但是務必要注意將SelectionMode設置為None。

private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e) {selectedItems = (List<object>)e.AddedItems; }

為ListView和GridViewt添加分組

本文承接“為ListView和GridView添加數據”。

在上一節中我們已經了解了怎樣將數據綁定到ListView或GridView,但既然要用到這兩個控件往往是因為數據繁多,那么幾乎就不可避免的要讓其能夠分組。我們所綁定的數據源可能是項列表,其中的每個項甚至還有其自己的項,那么問題就來了。

一時不會也想不出什么宏偉的例子,就做一個簡單的鬧鐘的時間表的ListView和GridView吧。那么先在項目中添加一個類,最好在Shared下。內容都是很簡易的,鬧鐘的標題、時間、備注等,為了增加一級目錄就加了一個AlarmMode,就算作學習和生活吧,學習生活兩不誤……

public class Alarm {public string Title { get; set; }public DateTime AlarmClockTime { get; set; }public string Description { get; set; }public string AlarmMode { get; set; } } public class AlarmMode {public AlarmMode(){alarmMode = new ObservableCollection<Alarm>();}public string Name { get; set; }public ObservableCollection<Alarm> alarmMode { get; private set; } }

首先,先來定義一個全局的時間,然后在頁面加載時加載兩個函數(將在下一步定義)。

DateTime globalTime; protected override void OnNavigatedTo(NavigationEventArgs e) {DateTime.TryParse("1/1/2115", out globalTime);AddAlarm();AddAlarmMode(); }

一大波數據正在靠近!

private void AddAlarm() {List<Alarm> listAlarm = new List<Alarm>();listAlarm.Add(new Alarm(){Title = "Alarm1",Description = "First Alarm",AlarmClockTime = globalTime.AddHours(1),AlarmMode = "Alarm In Life"});listAlarm.Add(new Alarm(){Title = "Alarm2",Description = "Second Alarm",AlarmClockTime = globalTime.AddHours(11),AlarmMode = "Alarm In Life"});listAlarm.Add(new Alarm(){Title = "Alarm3",Description = "Third Alarm",AlarmClockTime = globalTime.AddDays(1),AlarmMode = "Alarm In Life"});listAlarm.Add(new Alarm(){Title = "Alarm1",Description = "First Alarm",AlarmClockTime = globalTime.AddHours(12),AlarmMode = "Alarm In Study"});listAlarm.Add(new Alarm(){Title = "Alarm2",Description = "Second Alarm",AlarmClockTime = globalTime.AddHours(15),AlarmMode = "Alarm In Study"});listAlarm.Add(new Alarm(){Title = "Alarm3",Description = "Third Alarm",AlarmClockTime = globalTime.AddMonths(1),AlarmMode = "Alarm In Study"});ar alarmSetting = from ala in listAlarmgroup alaby ala.AlarmModeinto alaSettingorderby alaSetting.Keyselect alaSetting;collectionVSAlarm.Source = alarmSetting; }private void AddAlarmMode() {List<AlarmMode> listAlarmMode = new List<AlarmMode>();AlarmMode am1 = new AlarmMode();am1.Name = "Alarm In Life";am1.alarmMode.Add(new Alarm(){Title = "Alarm1",Description = "First Alarm",AlarmClockTime = globalTime.AddHours(1),});am1.alarmMode.Add(new Alarm(){Title = "Alarm2",Description = "Second Alarm",AlarmClockTime = globalTime.AddHours(11),});am1.alarmMode.Add(new Alarm(){Title = "Alarm3",Description = "Third Alarm",AlarmClockTime = globalTime.AddDays(1),});listAlarmMode.Add(am1);AlarmMode am2 = new AlarmMode();am2.Name = "Alarm In Study";am2.alarmMode.Add(new Alarm(){Title = "Alarm1",Description = "First Alarm",AlarmClockTime = globalTime.AddHours(12),});am2.alarmMode.Add(new Alarm(){Title = "Alarm2",Description = "Second Alarm",AlarmClockTime = globalTime.AddHours(15),});am2.alarmMode.Add(new Alarm(){Title = "Alarm3",Description = "Third Alarm",AlarmClockTime = globalTime.AddMonths(1),});listAlarmMode.Add(am2);collectionVSAlarmMode.Source = listAlarmMode; }

這些數據都是亂七八糟啦,大家湊合著看。這是兩個函數,數據我都是用List<>來定義的,將數據通過Add函數添加到listAlarm和listAlarmMode中即可。最后再從listAlarm中根據AlarmMode挑出數據到alaSetting,同時還要根據Key值進行排序最后選出并連接到collectionVSAlarm的Source屬性中。這個是需要在MainPage.xaml中定義的哦,就像

<UserControl.Resources><CollectionViewSource x:Name="collectionVSAlarm" IsSourceGrouped="True"/><CollectionViewSource x:Name="collectionVSAlarmMode" IsSourceGrouped="True" ItemsPath="alarmMode"/></UserControl.Resources>

然后我們還需要創建一個ListGridGroupStyle類來繼承GroupStyleSelector,重載它的SelectGroupStyleCore方法,并且返回ListGridGroupStyleResource資源,這個資源在博客后文中有定義,其定義在App.xaml中。相應的代碼如下咯:

public class ListGridGroupStyle : GroupStyleSelector{protected override GroupStyle SelectGroupStyleCore(object group, uint level){return (GroupStyle)App.Current.Resources["ListGridGroupStyleResource"];}}

方法重載好之后就需要在前面的UserControl.Resources中加上以下這條代碼啦。

<local:ListGridGroupStyle x:Key="ListGridGroupStyleResource"/>

然后我們來一系列的基本樣式到App.xaml中就好啦,關于資源文件的使用我們在后面會系統的來學習。這里的DataTemplate和GroupStyle都在資源字典中,前者是Template模板,后者是Style風格。內容的排版大家都隨意啦,記得設置好Key值。

<Application.Resources><ResourceDictionary><DataTemplate x:Key="dataTemplateListView"><StackPanel Width="700" Margin="10"><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Title}" FontWeight="Bold" Margin="12"/><TextBlock Text="{Binding AlarmClockTime}" TextWrapping="NoWrap" Margin="12"/><TextBlock Text="{Binding Description}" TextWrapping="NoWrap" Margin="12"/></StackPanel></StackPanel></DataTemplate><GroupStyle x:Key="ListGridGroupStyleResource"><GroupStyle.HeaderTemplate><DataTemplate><Grid Background="LightGray" ><TextBlock Text='{Binding Key}' Foreground="CornflowerBlue" Margin="12" /></Grid></DataTemplate></GroupStyle.HeaderTemplate></GroupStyle></ResourceDictionary></Application.Resources>

那么這些各種資源都定義好了之后就在MainPage.xaml把下面這些敲進去。各種資源的調用在這里尤其需要注意,其實對于稍微復雜一丁點的程序而言,名稱就已經變得讓人崩潰了。所以擁有一個良好的命名習慣很重要。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><Grid.ColumnDefinitions><ColumnDefinition Width="auto"/><ColumnDefinition Width="auto"/></Grid.ColumnDefinitions><GridView Grid.Column="0" ItemsSource="{Binding Source={StaticResource collectionVSAlarmMode}}" Margin="12,120,12,12" MaxHeight="600" ><GridView.ItemTemplate><DataTemplate><StackPanel Margin="18"><TextBlock Text="{Binding Title}" FontWeight="ExtraBold" /><TextBlock Text="{Binding AlarmClockTime}" FontWeight="Light" TextWrapping="NoWrap" /><TextBlock Text="{Binding Description}" TextWrapping="NoWrap" /></StackPanel></DataTemplate></GridView.ItemTemplate><GridView.ItemsPanel><ItemsPanelTemplate><ItemsWrapGrid MaximumRowsOrColumns="2"/></ItemsPanelTemplate></GridView.ItemsPanel><GridView.GroupStyle><GroupStyle><GroupStyle.HeaderTemplate><DataTemplate><Grid Background="Green" Margin="12"><TextBlock Text='{Binding Name}' Foreground="Bisque" Margin="36"/></Grid></DataTemplate></GroupStyle.HeaderTemplate> </GroupStyle></GridView.GroupStyle></GridView><ListView Grid.Column="1" ItemsSource="{Binding Source={StaticResource collectionVSAlarm}}" ItemTemplate="{StaticResource dataTemplateListView}" GroupStyleSelector="{StaticResource ListGridGroupStyleResource}" Margin="120" /> </Grid>

我這寫的真是太丑了哎,做產品的時候可得好好調調了。

縮放視圖SemanticZoom

相信用過Windows Phone或者Windows 8/8.1/10的朋友對下面這張截圖肯定不陌生。這就是通過SemanticZoom來實現的,當數據過多時,這種控件尤其適用。它有一個放大視圖ZoomedInView和一個縮小試圖ZoomedOutView,前者主要用來顯示當前頁面的詳細信息,后者則致力于快速導航。

那么我就自己來動手實踐咯,首先我們在XAML中添加大致的界面,就像畫畫要先畫輪廓一樣。

<Grid Name="grid1" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><SemanticZoom x:Name="semanticZoom" VerticalAlignment="Center" HorizontalAlignment="Center"> <SemanticZoom.ZoomedOutView></SemanticZoom.ZoomedOutView><SemanticZoom.ZoomedInView></SemanticZoom.ZoomedInView></SemanticZoom></Grid>

然后分別在這兩個視圖中添加你想要加入的東西。這里的核心就是,ZoomedOutView和ZoomedInView都是使用的同一個CollectionViewSource對象作為自己的數據集的。而這個屬性我們在“為ListView和GridView分組”談到過。

我們先把后臺代碼寫好,我就像一篇那樣裝模作樣寫一個類吧。

public class Alarm{public string Title { get; set; }public DateTime AlarmClockTime { get; set; }public string Description { get; set; } }

然后用一個函數來添加一大堆數據……一大堆數據。

private Alarm[] AddAlarmData() {return new Alarm[]{new Alarm {Title="Alarm 1",AlarmClockTime=globalTime.AddHours(17),Description="First Alarm for Study" },new Alarm {Title="Alarm 2",AlarmClockTime=globalTime.AddHours(2),Description="Second Alarm for Study" },new Alarm {Title="Alarm 3",AlarmClockTime=globalTime.AddHours(7),Description="Third Alarm for Study" },new Alarm {Title="Alarm 4",AlarmClockTime=globalTime.AddHours(4),Description="4th Alarm for Study" },new Alarm {Title="Alarm 5",AlarmClockTime=globalTime.AddHours(5),Description="First Alarm for Fun" },new Alarm {Title="Alarm 6",AlarmClockTime=globalTime.AddHours(1),Description="First Alarm for Fun" },new Alarm {Title="Alarm 7",AlarmClockTime=globalTime.AddHours(15),Description="Second Alarm for Fun" },new Alarm {Title="Alarm 8",AlarmClockTime=globalTime.AddHours(9),Description="Third Alarm for Fun" },new Alarm {Title="Alarm 9",AlarmClockTime=globalTime.AddHours(20),Description="4th Alarm for Fun" },new Alarm {Title="Alarm 10",AlarmClockTime=globalTime.AddHours(14),Description="Second Alarm for Sleep" },new Alarm {Title="Alarm 11",AlarmClockTime=globalTime.AddHours(9),Description="First Alarm for Sleep" }}; }

因為我們最后要把放大視圖變成縮小視圖,記得縮小視圖上面有一些ABCD之類的字母么,這里我們用的是時間,就分成中午晚上等好啦。就通過下面這樣的一個函數來搞定。其用了一個鍵值對,用time作為參數。后面再將這些數據篩選出來,綁定到新添加的CollectionViewSource中。至于gridView1和gridView2是即將添加到XAML中,這里可以先不填,一回再補上。

Func<int, string> SwitchTime = (time) => {if (time <= 10 && time >= 6) return "上午";else if (time > 10 && time < 14) return "中午";else if (time >= 14 && time <= 20) return "下午";else return "晚上"; }; var varTime = from t in AddAlarmData()orderby t.AlarmClockTime.Hourgroup t by SwitchTime(t.AlarmClockTime.Hour); CollectionViewSource collectionVS = new CollectionViewSource(); collectionVS.IsSourceGrouped = true; collectionVS.Source = varTime; this.gridView1.ItemsSource = collectionVS.View.CollectionGroups; this.gridView2.ItemsSource = collectionVS.View;

我們先來寫主視圖(也就是放大視圖)。

<GridView x:Name="gridView2" IsSwipeEnabled="True" HorizontalAlignment="Center" VerticalAlignment="Center" ScrollViewer.IsHorizontalScrollChainingEnabled="False" Width="1800" Height="1000"><GridView.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal" Margin="12" HorizontalAlignment="Left" Background="White"><TextBlock Text="{Binding Title}" TextWrapping="Wrap" Foreground="Red" FontFamily="Harrington"Width="150" Height="100" FontSize="26" FontWeight="Light"/><TextBlock Text="{Binding AlarmClockTime}" Foreground="Red" TextWrapping="Wrap" Width="150" Height="100" FontFamily="Harrington" FontSize="26" FontWeight="Light"/><TextBlock Text="{Binding Description}" Foreground="Red" TextWrapping="Wrap" Width="150" Height="100" FontFamily="Harrington" FontSize="26" FontWeight="Light"/></StackPanel></DataTemplate></GridView.ItemTemplate><GridView.ItemsPanel><ItemsPanelTemplate><ItemsWrapGrid MaximumRowsOrColumns="8"/></ItemsPanelTemplate></GridView.ItemsPanel><GridView.GroupStyle><GroupStyle><GroupStyle.HeaderTemplate><DataTemplate><TextBlock Text='{Binding Key}' Foreground="{StaticResource ApplicationForegroundThemeBrush}" Margin="12" FontSize="30" FontFamily="華文彩云" FontWeight="ExtraBold" /></DataTemplate></GroupStyle.HeaderTemplate></GroupStyle></GridView.GroupStyle> </GridView>

相信大家都能看得懂,另外稍后我會在截圖中添加一些注釋的哦。然后是縮小視圖。

<GridView Name="gridView1" Background="Wheat" ScrollViewer.IsHorizontalScrollChainingEnabled="False" HorizontalAlignment="Center" VerticalAlignment="Center" Width="600" Height="200"><GridView.ItemTemplate><DataTemplate><TextBlock Width="100" Height="100" Text="{Binding Group.Key}" FontFamily="華文行楷" FontWeight="Normal" FontSize="24" /></DataTemplate></GridView.ItemTemplate><GridView.ItemsPanel><ItemsPanelTemplate><ItemsWrapGrid ItemWidth="100" ItemHeight="100" MaximumRowsOrColumns="2"/></ItemsPanelTemplate></GridView.ItemsPanel><GridView.ItemContainerStyle><Style TargetType="GridViewItem"><Setter Property="Margin" Value="12" /><Setter Property="Padding" Value="3" /><Setter Property="BorderThickness" Value="1" /><Setter Property="Background" Value="Green"/></Style></GridView.ItemContainerStyle> </GridView>

那么代碼就到這里為止了,接下來自然就是截圖了。

(這種圖片如果看不清的話可以保存到電腦上再看。)

想了解字體相關的信息,可以看第九章的“使用更多字體”。

數據綁定介紹

簡單的數據綁定示例

相比于理論,我更傾向于從實踐中開始博客,尤其是對于數據綁定。那么,我們先來看看幾個簡單的例子。

1.數據綁定到TextBox

我們依舊使用前面的鬧鐘類來開始。在下面的代碼中,我們有屬性、構造函數,還有一個ToString()方法的重載。之所以重載這個方法是因為我們想在最后綁定的時候,這三個屬性能夠在TextBox上顯示得更加工整。

public class Alarm{public string Title { get; set; }public string Description { get; set; }public DateTime AlarmTime { get; set; }public Alarm() { }public Alarm(string title, string description,DateTime alarmTime){Title = title; Description = description;AlarmTime = alarmTime;}public override string ToString(){return "Title: " + Title +"\n"+ "Time: "+ AlarmTime.ToString("d") + "\n"+ "Description: " + Description;}}

接下來再在XAML中添加TextBox控件如下,因為TextBox此時是用作顯示而非輸入,所以建議設置其的只讀屬性。數據綁定的核心就是Text屬性中的那么一個Binding關鍵字。

<TextBox x:Name="textBox1" FontSize="28" Height="150" Width="400"TextWrapping="Wrap" Text="{Binding}" IsReadOnly="True"/>

但是光這樣還不夠,我們還需要在后臺代碼中將數據綁定到textBox1的DataContext(數據上下文)中。

textBox1.DataContext = new Alarm("First Alarm", "I need to study!", new DateTime(2015, 4, 11));

相信大家并不為覺得這個很難,相反我在學數據綁定的時候一上來就是一大堆理論,以至于我對數據一詞有了陰影——所以我學數據結構非常痛苦。

2.數據綁定到ComboBox

才保存一個鬧鐘沒太大意思,我們多來幾個。

public ObservableCollection<Alarm> UsefulAlarm = new ObservableCollection<Alarm>();public MainPage(){this.InitializeComponent();UsefulAlarm.Add(new Alarm("First Alarm", "I need to study!", new DateTime(2015, 4, 11)));UsefulAlarm.Add(new Alarm("First Alarm", "Read a magzine!", new DateTime(2015, 4, 12)));UsefulAlarm.Add(new Alarm("First Alarm", "Write a blog!", new DateTime(2015, 4, 15)));UsefulAlarm.Add(new Alarm("First Alarm", "Travel", new DateTime(2015, 5, 15)));textBox1.DataContext = UsefulAlarm;}

但是……

很顯然我們用了ObservableCollection< T >類,它為數據綁定提供了一個集合,這是因為它實現了INotifyPropertyChanged和INotifyCollectionChanged接口。顧名思義,當屬性改變時,它可以通知它所綁定的控件,并且如果你希望該空間能夠同步更新,則將用于綁定的對象也實現INotifyPropertyChanged接口。這個類好歸好,但相對于TextBox而言算有些高端了,以至于它無法顯示出來。但是我們可以用ComboBox來代替它,我們的類并不需要修改,前面的UsefulAlarm實例化也都不用改,只需要將textBox1改成comboBox1即可。以下是新的ComboBox代碼。

<ComboBox Name="comboBox1" ItemsSource="{Binding}" FontSize="28" Height="150" Width="400"><ComboBox.ItemTemplate><DataTemplate> <StackPanel Orientation="Vertical" Margin="8"><TextBox Width="350" TextWrapping="Wrap" Text="{Binding Title}" IsReadOnly="True"/><TextBox Width="350" TextWrapping="Wrap" Text="{Binding Description}" IsReadOnly="True"/><TextBox Width="350" TextWrapping="Wrap" Text="{Binding AlarmTime}" IsReadOnly="True"/></StackPanel> </DataTemplate></ComboBox.ItemTemplate> </ComboBox>

在圖示中我們也容易發現TextBox和ComboBox兩個控件的Width屬性的應用區別。在TextBox中,我們將數據綁定到Text中;而在ComboBox中,我們則是將數據綁定到ItemsSource中,簡單的說就是ComboBox拿來所有的數據,再將它們分成小的細節發給它的子對象,這些子對象都在ComboBox的DataTemplate(數據容器)中。

在這里我們并沒有用到前面所重載的ToString()函數,因為我們已經分別將Title、Description、AlarmTime綁定到相應的TextBox控件了。那圖示中又為什么這些數據都是一行一行的表示呢,這都是布局控件StackPanel的功勞,全靠它的Orientation屬性。如果將這個屬性設置成Horizontal呢,那標題、描述已經時間就是全排在一行了。

3.數據綁定到ListBox

聽說ListBox和ComboBox很類似哦,它們都是Box……XBox呀。博主我有點懶,那可不可以直接將ComboBox的名字改成ListBox就直接運行呢,答案是可以哦!那么區別到底在哪里呢?看看這張圖就知道啦。

咦?怎么只有一條鬧鐘了?別驚慌……拖動右邊的滾動條就可以查看到全部的鬧鐘咯。我真的只把ComboBox改成ListBox還有相應的Name屬性(包括后臺代碼中的名字哦),以下就是完整的代碼啦,我會騙你?

<ListBox Name="listBox1" ItemsSource="{Binding}" FontSize="28" Height="150" Width="400"><ListBox.ItemTemplate><DataTemplate><StackPanel Orientation="Vertical" Margin="8"><TextBox Width="350" TextWrapping="Wrap" Text="{Binding Title}" IsReadOnly="True"/><TextBox Width="350" TextWrapping="Wrap" Text="{Binding Description}" IsReadOnly="True"/><TextBox Width="350" TextWrapping="Wrap" Text="{Binding AlarmTime}" IsReadOnly="True"/></StackPanel></DataTemplate></ListBox.ItemTemplate></ListBox>

4.數據綁定到ListView

看了前面的代碼相信我沒有騙你吧,童鞋們看到ListBox有沒有想到ListView呢?我要是想說還是和前面一樣只用改名字等就可以用ListView,你還是不信么?

<ListView Name="listView1" ItemsSource="{Binding}" FontSize="28" Height="150" Width="400"><ListView.ItemTemplate><DataTemplate><StackPanel Orientation="Vertical" Margin="8"><TextBox Width="350" TextWrapping="Wrap" Text="{Binding Title}" IsReadOnly="True"/><TextBox Width="350" TextWrapping="Wrap" Text="{Binding Description}" IsReadOnly="True"/><TextBox Width="350" TextWrapping="Wrap" Text="{Binding AlarmTime}" IsReadOnly="True"/></StackPanel></DataTemplate></ListView.ItemTemplate></ListView>

當然了,還是用右邊的滾動條來下拉以查看所有的數據。不過ListView君的最佳姿勢不是這樣哦,將Height改為600才是呢??聪聢D——這才是高大上的ListView君嘛!

好了不玩了,GridView也是可以這樣弄得,不信你試試。

再談數據綁定

1.我們為什么要用數據綁定

很顯然,我們不可能把所有的數據全部固定在特定的控件上。比如,游戲的積分、設定的鬧鐘、天氣預報甚至的通訊類的消息,它們都并非是一成不變的。但是也并非所有的控件都需要綁定,比如你的App的名字、發送消息時所用的發送按鈕上面的文本等。

2.那數據和UI之間又有哪些關系呢

首先我們得明確,數據的顯示和其后臺的管理是不一樣的。數據與UI綁定之后,我們的數據就可以在這兩者之間進行溝通,如果數據發生變化時,綁定到數據的UI則會自動將相應的屬性進行調整,不僅僅是前面用到的Text屬性,還有FontSize、Width、Foreground、Image屬性都可以。

3.數據綁定到底是綁定什么

首先,我們得有綁定源,這些就是我們需要綁定的數據,沒有數據,即使你綁定了,它也顯示不出來。
其次,我們還需要綁定目標,也就是Framework類的DependencyProperty屬性,說得白話文點就是將數據綁定到UI的相應屬性上。
最后,我們還需要一個Binding對象,它就像是搬運工,沒有它,數據也是無法動彈的。它能夠幫助我們將數據從數據源移動到綁定目標,并且將綁定目標的相應消息通知給綁定源。它還有一些巧妙的工具,能夠將綁定源的數據加工成特定的格式。

4.綁定源有哪些

所有的公共語言運行時對象,我們前面用的Alarm類就是這種對象,另外UI元素也是哦。

5.聽說有的搬運工只能將數據源的數據一次性搬到綁定目標后就不再搬了,而有的搬運工則會在數據修改后再搬一次,甚至還有的能夠在綁定目標更改后再將數據搬回到數據源

OneTime綁定:這個搬運工的工作就是第一種,它只負責在創建時將源數據更新到綁定目標。
OneWay綁定:這是系統默認的搬運工,它是第二種,負責在創建時以及源數據發生更改時更新綁定目標。
TwoWay綁定:這個搬運工則是第三種,它能夠在綁定源和綁定目標的一邊發生更改時同時更新綁定源和綁定目標。但它在一種時候卻會偷懶,那就是對于TextBox.Text每次點擊之后,它就不會將這個Text屬性的更改更新到綁定源。不過如果碰到Boss,它也只能繼續搬了。那就是將Binding.UpdateSourceTrigger設置成PropertyChanged。而默認情況下,只有TextBox失去焦點時才會去更新。

以下分別是OneWay和TwoWay的例子:

<StackPanel Width="240" Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center"><Slider Name="slider1" Minimum="0" Maximum="100"/><TextBox FontSize="30" Text="{Binding ElementName=slider1,Path=Value,Mode=OneWay}" /></StackPanel>

拖動滑動條,就可以看到在TextBox中顯示它的值的變化了。如果希望它只變化一次,那就將代碼中的OneWay改成OneTime即可。

<StackPanel Width="240" Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center"><TextBox FontSize="30" Name="textBox" Height="60" Text ="{Binding ElementName=listBox1, Path=SelectedItem.Content, Mode=TwoWay}"></TextBox> <ListBox FontSize="30" Name="listBox1"><ListBoxItem Content="Item 1"/><ListBoxItem Content="Item 2"/><ListBoxItem Content="Item 3"/><ListBoxItem Content="Item 4"/></ListBox></StackPanel>

如下圖所示,點擊Item 1后TextBox則會顯示相應的Item 1,將TextBox中的Item 1修改為Item 5后再ListBox中也自動修改成了Item5。

簡單示例:Foreground的數據綁定

前面已經說到了Foreground也可以綁定,想不想試試呢。我們現在TextBox中寫一個TextBox,然后在后臺代碼中添加一個綁定就可以了。這個和前面的比較簡單,這里只是用來引出后面的東東哦

<TextBox Name="textBox" Width="200" Height="100" IsReadOnly="True"FontSize="32" Text="Text" Foreground="{Binding ForeBrush}"/> textBox.Foreground = new SolidColorBrush(Colors.BlueViolet);

更改通知

1.Silder綁定到TextBlock,不使用更改通知

首先定義一個簡單的類BindingSlider,同時在XAML中作如下定義。

public class BindingSlider{private int sliderValue;public int SliderValue{get{return sliderValue;}set{sliderValue = value;}}} <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center"><Slider Name="slider1" Minimum="0" Maximum="100" Width="200" Value="{Binding SliderValue,Mode=TwoWay}"/><Button x:Name="button" Content="Button" Width="200" Click="button_Click"/><TextBlock Name="textBlock" FontSize="30"/> </StackPanel>

雖然這里只是用到了OneWay傳遞,但還是需要使用TwoWay。因為在這里OneWay是指從BindingSlider類的SliderValue屬性單向傳遞到Slider控件的Value屬性。但我們需要的則是Slider控件的Value屬性單向傳遞到BindingSlider類的SliderValue屬性,所以才得使用TwoWay方式。

BindingSlider bindingSlider = new BindingSlider();public MainPage(){this.InitializeComponent();slider1.DataContext = bindingSlider;}private void button_Click(object sender, RoutedEventArgs e){textBlock.Text = bindingSlider.SliderValue.ToString();}

首先實例化BindingSlider類,再在后臺代碼中獎bindingSlider對象綁定到slider1的數據上下文。最后通過Click事件來將bindingSlider對象的SliderValue屬性傳遞給textBlock控件的Text屬性。

這里的效果就是,拖動Slider但是TextBlock不會有變化,而需要Button來不斷的更改TextBlock的Text。如果想要TextBlock的Text能夠根據Slider實時的更改,這就需要”更改通知“了。

2.Silder綁定到TextBlock,使用更改通知

既然要使用通知更改的技術,那就可以在XAML代碼中將Button控件刪除掉了,包括后臺代碼中的Click事件。

緊接著來修改BindingSlider類,首先得使用INotifyPropertyChanged接口。這個接口有PropertyChanged事件,而這個事件則會告知綁定目標綁定源已經發生修改,這樣綁定目標也會實時的進行更改。在新的set中,我們將SliderValue值傳遞到NotifyPropertyChanged中。

public class BindingSlider :INotifyPropertyChanged{private int sliderValue;public int SliderValue{get{return sliderValue;}set{sliderValue = value;NotifyPropertyChanged("SliderValue"); }} public event PropertyChangedEventHandler PropertyChanged;public void NotifyPropertyChanged(string propertyName){if (PropertyChanged != null){PropertyChanged(this,new PropertyChangedEventArgs(propertyName));}}}

最后我們還需要將bindingSlider對象綁定到textBlock的數據上下文。

BindingSlider bindingSlider = new BindingSlider();public MainPage(){this.InitializeComponent();slider1.DataContext = bindingSlider;textBlock.DataContext = bindingSlider; }

這樣一來就全部更改完成了,試試就會發現TextBlock的Text會根據Slider的拖動而實時修改了。

值轉換器

有時候默認的輸出方式不能滿足我們的需要,比如前面的OneWay示例,可能我們需要的是在TextBox中顯示“開始加載“、”加載一半了“、”很快就加載完了“以及”已經加載好“等,甚至還可以讓其能夠轉換成英文哦。

那么首先新建一個類SliderValueConverter.cs,然后實現IValueConverter接口。然后按自己的需要寫它的Converter方法即可。

public class SliderNotifyAndConverter : IValueConverter {public object Convert(object value, Type targetType, object parameter, string language){string valueTextBlock;string parameterValue = parameter.ToString();double valueSlider = (double)value;if (valueSlider > 0&&valueSlider<=5){if (parameterValue == "zh-cn")valueTextBlock = "開始加載";elsevalueTextBlock = "Starts to load";}else if (valueSlider >= 45 && valueSlider <= 55){if (parameterValue == "zh-cn")valueTextBlock = "加載一半了";elsevalueTextBlock = "loaded half";}else if (valueSlider >= 90&&valueSlider<100){if (parameterValue == "zh-cn")valueTextBlock = " 很快就加載完了";elsevalueTextBlock = "finished loading very quickly";}else if (valueSlider == 100){if (parameterValue == "zh-cn")valueTextBlock = " 已經加載好";elsevalueTextBlock = "loaded";}else{if (parameterValue == "zh-cn")valueTextBlock = "加載中";elsevalueTextBlock = "Loading";}return valueTextBlock;}public object ConvertBack(object value, Type targetType, object parameter, string language){throw new NotImplementedException();}}

最后還需要在XAML中添加如下代碼哦,值轉換器Converter所使用的靜態資源已經在

<Page.Resources><local:SliderNotifyAndConverter x:Key="SliderNotifyAndConverterResources"/></Page.Resources><Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><StackPanel Name="stackPanel" Width="450" Orientation="Vertical"HorizontalAlignment="Center" VerticalAlignment="Center"><Slider Name="slider1" Minimum="0" Maximum="100"Value="95"/><TextBlock FontSize="30" Text="{Binding ElementName=slider1, Path=Value, Converter={StaticResource SliderNotifyAndConverterResources}, ConverterParameter='zh-cn'}"/><TextBlock FontSize="30" Text="{Binding ElementName=slider1, Path=Value, Converter={StaticResource SliderNotifyAndConverterResources}, ConverterParameter='en-us'}"/></StackPanel></Grid>

以下是Slider的Value取不同值時TextBlock的不同顯示。

這里僅僅是一個比較簡單的示例,在項目產品中往往有數據綁定的地方都會有值轉換器的,就像C++中經常重載ostream一樣。

總結

以上是生活随笔為你收集整理的Windows App开发之集合控件与数据绑定的全部內容,希望文章能夠幫你解決所遇到的問題。

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

av电影免费观看 | 精品日韩在线一区 | 97人人模人人爽人人少妇 | 一区二区激情视频 | 日韩成片| 国产九色91| 成人国产一区二区 | 久久欧美视频 | 成人午夜电影久久影院 | 97电影手机 | 国产原厂视频在线观看 | 国产成a人亚洲精v品在线观看 | 国产亚洲精品久久久久久大师 | 国产精品久久久久久久久久久久久 | 精品亚洲一区二区三区 | 人人干狠狠操 | 91久久国产精品 | 99久久99久久综合 | 国产午夜精品在线 | 日韩特级毛片 | 国产一级免费在线观看 | 国产中文在线播放 | 尤物一区二区三区 | 超碰在线观看99 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 视频在线播放国产 | 国产精品一区二区久久久久 | 亚洲理论片在线观看 | 毛片网在线播放 | 去看片 | 色国产精品| 久久久久久蜜桃一区二区 | aav在线 | 亚洲精品久久久久久久不卡四虎 | 欧美日韩一区二区三区在线免费观看 | www.久热 | 欧美日韩一级视频 | 天天爱天天操 | 国产精品精品国产婷婷这里av | 亚洲欧美日韩精品久久奇米一区 | 五月综合激情婷婷 | 国产色婷婷 | 特级毛片网站 | 国产网站色 | 久久草视频 | 99久久婷婷 | 天天操天天操天天操天天操天天操天天操 | 亚洲婷婷在线视频 | 成人黄色小说网 | 欧美最爽乱淫视频播放 | 久久久免费少妇 | 91自拍91| 久久久免费| 操老逼免费视频 | av一区二区三区在线观看 | 玖玖色在线观看 | 91九色视频国产 | 91av视频免费在线观看 | 成人黄色免费在线观看 | 中国美女一级看片 | 国产精品va最新国产精品视频 | 国产1级视频 | 午夜精品成人一区二区三区 | 国产精品区免费视频 | 欧美在线视频一区二区三区 | www.日本色 | 欧美最爽乱淫视频播放 | 国产精品免费一区二区三区在线观看 | 中文字幕亚洲综合久久五月天色无吗'' | 久久久久久久网 | 久久精品国产免费 | 欧美久久久久久久久久久久久 | 天天摸天天舔 | 久久免费精彩视频 | 在线只有精品 | 丁香婷婷综合网 | 日本系列中文字幕 | 国产成人一级电影 | 婷婷综合国产 | 亚洲专区视频在线观看 | 91精品在线免费视频 | 欧美中文字幕久久 | 亚洲国产精品激情在线观看 | 中文字幕有码在线观看 | 色婷婷在线视频 | 久久手机看片 | 国产一区二区三区免费观看视频 | 国产精品大片在线观看 | 又黄又爽又色无遮挡免费 | 色综合天| 日韩欧美精品一区 | 国产精品美女久久久久久免费 | 欧美日韩伦理一区 | 免费观看日韩av | 伊人色**天天综合婷婷 | 在线黄色av电影 | 黄色片视频免费 | 亚洲综合一区二区精品导航 | 亚洲精品自拍视频在线观看 | 8090yy亚洲精品久久 | 在线日本看片免费人成视久网 | 久久天天操 | 国产精品麻豆果冻传媒在线播放 | 婷婷社区五月天 | 日韩两性视频 | 综合铜03| 久久久色| 五月天中文在线 | 国产高清精 | 粉嫩av一区二区三区入口 | 国产视频九色蝌蚪 | 婷婷资源站| 992tv成人免费看片 | 久久久一本精品99久久精品66 | 黄色一及电影 | 超碰资源在线 | 日韩影视大全 | 日本少妇高清做爰视频 | 久草在线电影网 | 久久久国产成人 | 久久综合桃花 | 色久五月| 黄色小网站免费看 | 日韩av中文在线 | 欧美精品三级在线观看 | 日本精品一二区 | 99成人精品 | 国产精品久久在线观看 | 97精产国品一二三产区在线 | 亚洲精品在线视频 | 99热这里有 | 在线视频一区观看 | 香蕉视频在线网站 | 色婷婷成人网 | 黄免费在线观看 | av一区二区在线观看中文字幕 | 在线观看av免费观看 | 欧美片网站yy | 麻豆久久 | 色婷婷精品大在线视频 | 国产在线观看你懂得 | 麻豆系列在线观看 | 中文在线8新资源库 | 菠萝菠萝蜜在线播放 | 黄色片毛片 | 啪啪午夜免费 | 2021久久| 国产高清视频在线播放 | 精品欧美日韩 | 国产精品久久久久免费观看 | 天天干,天天操,天天射 | 18性欧美xxxⅹ性满足 | 97麻豆视频| 久草在线视频精品 | 欧产日产国产69 | 人人射人人澡 | 欧美日韩国产一二三区 | www.天堂av| 国产午夜影院 | 伊人成人激情 | 成人免费共享视频 | 久草网在线观看 | 国产视频在线观看一区 | 国产精品自产拍在线观看蜜 | 韩日三级av | av三级在线播放 | 亚洲人成人99网站 | 亚洲精品乱码久久久久久高潮 | 91av资源网| 亚洲天堂社区 | 精品麻豆 | 国产日韩欧美在线观看视频 | av在线等 | 欧美性色黄 | 中文字幕一区二区三区精华液 | 91女人18片女毛片60分钟 | 久久久网| 免费日韩 精品中文字幕视频在线 | 免费成视频 | 91在线视频观看 | 日韩av免费一区二区 | 久久毛片网 | 国产精品一区专区欧美日韩 | 91亚洲视频在线观看 | 免费黄色在线播放 | 又黄又网站 | 国产偷v国产偷∨精品视频 在线草 | 麻豆精品传媒视频 | 色资源在线 | 久久艹国产视频 | 91精品视频导航 | 久久久久国产精品免费网站 | 亚洲精品免费观看视频 | av电影在线免费观看 | 99在线免费视频观看 | 99精品视频观看 | 蜜臀久久99精品久久久酒店新书 | 国产群p | 精品视频资源站 | 日韩欧美电影网 | 91福利视频久久久久 | 免费亚洲一区二区 | 99视频精品 | 国产日本高清 | 日韩欧美精品一区二区三区经典 | 国产日韩欧美视频 | 激情视频在线观看网址 | 国产精品一区二区免费视频 | 欧美大片www | 欧美日韩超碰 | 久久精品久久99 | www夜夜| 999抗病毒口服液 | 国产在线91精品 | 99国产成+人+综合+亚洲 欧美 | 天天干天天做天天爱 | 亚洲在线视频观看 | 婷婷国产视频 | 91成人午夜| 中文字幕在线看视频 | 久久久久久久久网站 | 久久久久免费观看 | 久久精品免费播放 | 天天综合操 | 久久另类小说 | 日韩精品最新在线观看 | 天天翘av | 美女视频免费一区二区 | 国产精品网红直播 | 国产成人福利在线 | 亚洲在线激情 | 日本免费久久高清视频 | 欧美另类sm图片 | 999久久久久久 | 国产精品九九视频 | 五月天精品视频 | 亚洲国产一区在线观看 | www狠狠操 | 国产一级片免费播放 | 精品国产一区二区三区不卡 | 99精品视频网站 | 精品一二三四五区 | 午夜精品久久 | 在线观看免费黄色 | 精品一区二区三区四区在线 | 亚洲精品久久久久久国 | 天天综合入口 | 日韩一区二区免费在线观看 | 国产福利一区二区三区视频 | 久久综合色一综合色88 | 国际av在线 | 国产精品av在线 | 久久久久国产a免费观看rela | 人人爽人人澡 | 99久久99久久精品国产片果冰 | 超碰在线最新地址 | 成人毛片一区 | 精品在线观看免费 | 人人爽久久涩噜噜噜网站 | 99久久这里有精品 | 天天躁天天狠天天透 | 在线国产能看的 | 美腿丝袜av| 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 国产资源免费 | 国产v欧美 | av免费成人 | 激情影院在线观看 | 国产精品爽爽爽 | 成人理论在线观看 | 日韩女同一区二区三区在线观看 | 色综合久久中文字幕综合网 | 99色亚洲 | 日韩羞羞| 中文字幕精品一区二区三区电影 | 在线亚洲精品 | 人人草在线视频 | 日韩国产精品久久久久久亚洲 | 综合网天天 | 亚洲精品合集 | 在线视频 日韩 | 涩涩成人在线 | 国产99久久久国产精品 | 国产伦理久久精品久久久久_ | 久久久久国产精品www | 日韩av成人在线观看 | 中文字幕二区三区 | av久久在线| 日一日干一干 | 国产精品免费观看在线 | 日韩在线视频国产 | 日韩在线看片 | 精品极品在线 | 国产黄色成人 | 国模视频一区二区 | 欧美一区二区三区四区夜夜大片 | 美女在线国产 | 久久伊人操 | www日| 午夜精品福利在线 | 久久视频在线 | 免费在线中文字幕 | 久久都是精品 | 狠狠狠狠狠狠狠 | 欧美精品一区二区三区一线天视频 | 成人免费网站在线观看 | 黄色中文字幕在线 | 国产1区2| 日本久久成人 | 西西44人体做爰大胆视频 | 亚洲精品在线视频播放 | 亚洲精品午夜久久久久久久久久久 | 天天干,天天射,天天操,天天摸 | 人成免费网站 | 在线小视频你懂得 | 国产午夜小视频 | 黄色三级免费片 | 天堂成人在线 | 在线观看中文字幕第一页 | 亚洲一级片在线看 | 色五月色开心色婷婷色丁香 | 最近2019中文免费高清视频观看www99 | 国产天天综合 | 91视频久久久久 | 国产韩国精品一区二区三区 | 国产网红在线观看 | 中文字幕人成乱码在线观看 | 一区二区在线影院 | 中文字幕亚洲欧美 | 国产视频综合在线 | 9幺看片 | 久久精彩视频 | 日日干天天射 | 免费看网站在线 | 久久综合九色综合欧美就去吻 | 一区三区视频 | 久久久久日本精品一区二区三区 | 亚洲激情在线观看 | 五月天综合网 | 五月激情姐姐 | 国产精品99精品久久免费 | 中文字幕亚洲情99在线 | 视频二区在线 | 天天干视频在线 | 综合网成人 | 国产精品精品国产色婷婷 | 日韩av一卡二卡三卡 | 久久人人爽人人片 | 免费成人av | 天堂va欧美va亚洲va老司机 | 亚洲日本三级 | 日韩三级视频在线观看 | 人人舔人人干 | 狠狠操狠狠干2017 | 97在线观看视频免费 | 欧美 日韩 视频 | www.av免费观看 | 久9在线| 国产一级a毛片视频爆浆 | 黄色一级影院 | 亚洲午夜av久久乱码 | 欧美精品中文字幕亚洲专区 | 免费高清看电视网站 | 欧洲一区精品 | 色av男人的天堂免费在线 | 久久久久久久久久久久国产精品 | 99精品在线播放 | 国产明星视频三级a三级点| 国产精品丝袜在线 | 久草视频免费在线观看 | 中文字幕视频一区 | 女人18精品一区二区三区 | 国产亚洲在 | 91精品国产福利 | 高清精品在线 | 69视频网站| 伊人狠狠操 | 最近最新中文字幕视频 | 欧美精品久久久久久久久免 | 精品人人爽 | 日韩在线观看网站 | 亚洲精品一区二区网址 | 天天干夜夜爱 | 中文字幕欧美日韩va免费视频 | 香蕉视频一级 | 五月天婷婷免费视频 | 波多野结衣电影一区二区三区 | 欧美日韩国产在线精品 | 麻豆国产电影 | 天堂中文在线视频 | 成人app在线免费观看 | 欧美另类xxxx | 在线视频手机国产 | 亚洲专区 国产精品 | 操操综合网 | 免费日韩三级 | 国产一级片不卡 | 欧美日韩国产在线精品 | av免费在线网站 | 日韩av视屏在线观看 | 久久er99热精品一区二区三区 | 久久综合欧美 | www.亚洲精品视频 | 欧美淫视频 | 在线黄频 | 久久人人97超碰精品888 | 一区二区三区免费在线观看视频 | 国产精品99视频 | 亚洲区色| 中文亚洲欧美日韩 | wwwwwww黄 | 国产在线日韩 | 96精品在线 | 伊人影院在线观看 | 色吊丝在线永久观看最新版本 | 久久免费电影网 | 九九热精品视频在线观看 | 五月天天色| 18网站在线观看 | 三级黄色在线观看 | 午夜狠狠操 | 欧美久久电影 | 超碰最新网址 | 日韩r级电影在线观看 | 色999五月色 | 久久爱资源网 | 人人爽人人爽人人片av免 | 久久久久一区 | 日韩免费看视频 | 91精品伦理| 九九热在线精品视频 | 国产精品 日韩 欧美 | 日韩欧美国产精品 | 天天做综合网 | 98精品国产自产在线观看 | 久久久免费av| 久久激情日本aⅴ | 免费网站黄 | 欧美在线观看禁18 | jizz欧美性9 国产一区高清在线观看 | 99久久精品无免国产免费 | 日韩欧美91 | 在线成人中文字幕 | 99精品免费视频 | 在线播放视频一区 | 五月婷婷影视 | 精品国产成人在线影院 | 国内毛片毛片 | 久久综合五月天婷婷伊人 | 久久99亚洲网美利坚合众国 | av片子在线观看 | 99视频在线免费观看 | 色香蕉在线 | av看片在线观看 | 欧美激情精品久久久久久变态 | 操操碰| 欧美成人影音 | 中文字幕免费国产精品 | 国产日本三级 | 亚洲精品videossex少妇 | 国产黄色一级片在线 | av黄色免费看 | 国产精品一区二区在线 | 亚州精品成人 | 91成人蝌蚪 | 欧美性做爰猛烈叫床潮 | 一区二区三区中文字幕在线 | 欧美日韩在线免费观看视频 | 亚欧洲精品视频在线观看 | 视频在线一区二区三区 | 欧美黄色免费 | 久久久久久久久毛片 | 999免费视频 | 日本黄色免费观看 | 久久久免费网站 | 六月色播 | 欧美人体xx | 久久人人爽视频 | 婷婷色在线视频 | 久草线 | 亚洲国产精品va在线看 | 91精品成人久久 | 91av视频在线观看 | 国产精品原创在线 | 成人黄色资源 | 99久久er热在这里只有精品15 | 欧美一区二区三区激情视频 | 日韩精品免费一区二区 | 国产精品久久久一区二区 | 丁香六月天婷婷 | 国产日韩欧美精品在线观看 | 一级片视频免费观看 | 日本久久免费视频 | 久草免费在线视频 | av一级片网站 | 国产69精品久久久久9999apgf | 天天综合成人网 | 久久久综合九色合综国产精品 | 在线观看视频黄 | 国产成人综合精品 | 黄色电影在线免费观看 | 不卡视频国产 | 亚洲国产成人在线播放 | 亚洲视频大全 | 国产精品久久久久久电影 | 一区二区三区久久精品 | 日韩午夜小视频 | 免费看的黄网站软件 | 日韩视频免费观看高清 | 四虎影视8848aamm| 中文av免费 | 欧美日韩xxxxx | 日韩av偷拍 | 日韩在线观看高清 | 91麻豆精品国产91久久久久 | 亚洲精品在线网站 | 亚洲精品在线观看的 | 欧美在线视频不卡 | 九九色综合 | www.天天射| 久久久久久久久久影院 | 免费看三级黄色片 | 午夜在线观看影院 | 色婷婷综合成人av | av电影中文字幕 | 92国产精品久久久久首页 | 亚洲一区免费在线 | 国产亚州精品视频 | 最新国产在线视频 | 国产精品18久久久久久久久久久久 | 欧美肥妇free | 麻豆91在线播放 | 国产精品毛片一区视频播 | 成人97人人超碰人人99 | 成人国产精品久久久春色 | 日韩成人精品一区二区 | 久草在线视频在线观看 | 久久在线观看视频 | 97品白浆高清久久久久久 | 99国产高清| 91亚洲在线观看 | 精品一二三区视频 | 69人人 | 精品国产精品久久一区免费式 | 韩国av一区二区三区 | 五月婷婷综合激情网 | 色多多视频在线 | 欧美一级久久久久 | 99久久激情视频 | 日韩大片在线免费观看 | 亚洲精品乱码久久久久久蜜桃动漫 | 天天操综 | 日韩黄色免费在线观看 | 日韩两性视频 | 美女免费视频一区二区 | 欧洲精品在线视频 | a午夜在线 | 99久国产 | 精品中文字幕在线播放 | 天天做日日做天天爽视频免费 | 91亚洲综合 | 99热高清 | 国产精品久久网站 | 日韩午夜高清 | 亚洲成人黄色网址 | 99免费在线视频 | 日韩二区三区在线 | 亚洲男人天堂2018 | 丁香六月婷婷开心 | 夜夜干夜夜 | 不卡电影免费在线播放一区 | 久久黄色影院 | 又紧又大又爽精品一区二区 | 伊人夜夜 | 2017狠狠干 | 国产精品video | 天堂网av 在线 | 在线 视频 一区二区 | 国产成人三级三级三级97 | 国产精品久久久777 成人手机在线视频 | 亚洲成av人电影 | 又污又黄网站 | 97超碰人人澡| 亚洲精品国产视频 | 欧美吞精 | 久久综合99| 久久黄页 | 久久人人爽人人片av | 伊人久久影视 | 黄色片视频在线观看 | 久久久国产精品人人片99精片欧美一 | 国产在线国偷精品产拍免费yy | 91色国产 | 99久久精品日本一区二区免费 | 丁香婷婷色月天 | 国内一级片在线观看 | 欧美在线观看视频一区二区 | 国产中文欧美日韩在线 | 国产精品日韩在线观看 | 久久久污| 一区二区三区四区在线免费观看 | 国产成人精品一区二区三区福利 | 久久tv | 久久伦理影院 | 特级黄色片免费看 | 国产男女爽爽爽免费视频 | 91精品视频免费看 | 久久天堂影院 | 日韩激情一二三区 | www国产一区| 玖玖爱国产在线 | 成人一级视频在线观看 | 精品国产一区二区三区蜜臀 | 欧美一区二区在线 | 六月丁香综合网 | 久久久91精品国产一区二区三区 | 色婷婷狠狠18 | 久久久亚洲成人 | 久久精品美女视频 | 精品免费在线视频 | 高潮久久久久久久久 | 亚洲激情综合网 | 91色在线观看视频 | 精品三级av| 欧美va天堂va视频va在线 | 欧美日韩高清一区二区三区 | 国产 日韩 中文字幕 | 99精品电影 | 天天弄天天操 | 视频一区二区在线观看 | 国产一区二区三精品久久久无广告 | 又爽又黄又无遮挡网站动态图 | 玖玖在线播放 | 日韩午夜网站 | 一区二区电影在线观看 | 免费看精品久久片 | 99久久婷婷国产 | 在线播放一区 | 97超碰在线久草超碰在线观看 | av在线看网站| 日韩爱爱网站 | 亚洲第一av在线播放 | 伊人久久av | 97超级碰碰碰碰久久久久 | 国产一区二区在线观看免费 | 99久久久精品| 在线国产黄色 | 精品免费 | 天天草天天插 | 免费看的黄色的网站 | 亚洲经典视频在线观看 | 亚洲成人家庭影院 | 国产高清免费av | 日韩欧美精品在线 | 国产黄色在线看 | 天天综合在线观看 | 精品免费在线视频 | 丁香激情网 | 亚洲激情六月 | 亚洲乱码精品久久久久 | 在线天堂日本 | 九九视频一区 | 国产高清视频网 | 久久天堂亚洲 | 婷婷激情综合五月天 | 国产成人精品久久 | 成人黄色一级视频 | 久草9视频 | a级免费观看 | 久久免费美女视频 | 9ⅰ精品久久久久久久久中文字幕 | www.久久久.com | 欧美日韩高清一区 | 日韩肉感妇bbwbbwbbw | 国产一区国产二区在线观看 | 国产亚洲精品久久久久久无几年桃 | 欧美一级视频免费 | 99视频在线免费观看 | 久久夜色电影 | 国产一卡二卡四卡国 | 亚洲电影院 | 亚洲欧美偷拍另类 | 中文av字幕在线观看 | av不卡免费看 | av日韩国产 | 色婷婷激情电影 | 欧美一级免费 | 欧美一级免费片 | 一级成人免费 | 国产亚洲午夜高清国产拍精品 | 国产精品久久99综合免费观看尤物 | 久久精品99久久 | 最近高清中文字幕在线国语5 | 91香蕉视频污在线 | av黄色一级片 | 国产大尺度视频 | 久久精品国产成人 | 欧美性色19p| 日韩中字在线 | 精品亚洲视频在线观看 | 免费午夜网站 | 狠狠色免费 | 久久精品一区二区三 | 手机av在线不卡 | a黄色大片| 91视频91自拍 | 免费在线观看av网站 | 91精品一区二区三区蜜臀 | 手机在线视频福利 | 久久一级片 | 欧美日韩国产一区二区在线观看 | 99在线精品免费视频九九视 | 国产极品尤物在线 | 国产 一区二区三区 在线 | 天天骚夜夜操 | 激情丁香在线 | 夜夜夜夜操 | 亚洲最大激情中文字幕 | 在线免费国产 | 午夜美女网站 | 97**国产露脸精品国产 | 97免费在线观看视频 | 久久久久夜色 | 久久免费看毛片 | 日本在线视频一区二区三区 | 国产精品video爽爽爽爽 | www.在线看片.com| 欧美精品色| 在线亚洲高清视频 | 又污又黄网站 | 欧洲亚洲精品 | 五月天婷婷丁香花 | 爱色av.com| 九九久久久久久久久激情 | 超碰免费av | 久久久精品 一区二区三区 国产99视频在线观看 | 狠狠操导航 | 色婷婷欧美 | 欧美乱码精品一区 | 久久综合精品国产一区二区三区 | 日韩在线视频二区 | 欧美日本国产在线观看 | 中文字幕日韩免费视频 | 日韩精品不卡在线 | 免费看麻豆 | 中文字幕在线免费97 | 激情网站网址 | 欧美精品三级 | 天天色天天草天天射 | 国产精品成人自产拍在线观看 | 青青河边草免费观看完整版高清 | 国产成人99av超碰超爽 | 国产成人久久精品77777综合 | 免费av片在线 | 国产特级毛片aaaaaa高清 | 亚洲国产中文字幕 | 精品一区二区三区四区在线 | 日本午夜免费福利视频 | 91最新国产 | 偷拍视频一区 | 日韩精品三区四区 | 日日草天天草 | 免费看污在线观看 | 久久视频在线观看 | 成人黄色影片在线 | 天天射射天天 | 亚洲精品黄色在线观看 | 超碰国产97 | 国产成人精品久久亚洲高清不卡 | 亚洲精品中文在线 | 欧美日韩视频在线观看免费 | 91亚洲欧美激情 | 国产精品免费在线视频 | 色综合久久久久久中文网 | 青青河边草免费视频 | 人人看人人爱 | 永久黄网站色视频免费观看w | www.久久成人 | 最近中文字幕在线播放 | 日韩高清免费在线 | 免费观看一区二区三区视频 | 欧美狠狠色 | 欧美精品一区二区免费 | 国产精品久久久久久久久免费 | 亚洲欧洲日韩 | av一本久道久久波多野结衣 | 亚洲欧美日本国产 | 一区二区影院 | 中文字幕在线看人 | 天天综合天天综合 | 国产精品自产拍在线观看网站 | 精品一区二区三区久久久 | 综合铜03| 中文字幕日韩国产 | 国产韩国精品一区二区三区 | 色综合咪咪久久网 | av先锋影音少妇 | 亚洲精品高清一区二区三区四区 | 免费看国产a | 亚洲精品自在在线观看 | 国产一二区免费视频 | 亚洲乱亚洲乱妇 | 国产精品综合av一区二区国产馆 | 久久久久久久av麻豆果冻 | 国产亚洲成av片在线观看 | 国产免费一区二区三区最新6 | 欧美一区二区三区免费看 | 亚洲精品视频偷拍 | 亚洲精品中文在线资源 | 久久av一区二区三区亚洲 | 欧美日韩国产xxx | 亚洲伦理电影在线 | 激情开心色 | 免费欧美 | 黄色三级网站在线观看 | 人人爽人人爽人人爽 | 国产午夜精品久久 | 99免费国产| 国产电影黄色av | 亚洲黑丝少妇 | 色综合综合| 成人av电影免费在线播放 | 婷婷激情在线观看 | 精品国模一区二区三区 | 免费看片网页 | 免费三级黄 | 成人欧美亚洲 | 四虎在线观看视频 | 天天曰天天射 | 中文字幕制服丝袜av久久 | 成人毛片在线观看视频 | 精品一区二区在线观看 | 中国一级特黄毛片大片久久 | 国语自产偷拍精品视频偷 | 天天干天天插 | 国内精品久久久久影院一蜜桃 | 久久综合久久综合久久综合 | 国产精品一区二区免费视频 | 蜜臀久久99精品久久久酒店新书 | 亚洲一区二区精品3399 | 久久久久久久久影视 | 国产91av视频在线观看 | 玖玖视频免费在线 | 97精品久久 | 亚洲在线a | 在线观看av免费 | 欧美少妇18p | 超碰人人草人人 | 91精品一区在线观看 | 日韩欧美精品在线观看 | 日韩午夜精品福利 | 欧美在线视频二区 | 婷婷丁香色综合狠狠色 | 亚洲精品xx | 狠狠狠色 | 综合久久网| 黄色一级大片免费看 | 欧美国产日韩中文 | 九九热99视频 | 欧美久草视频 | 天天做天天看 | 色姑娘综合天天 | 色婷婷综合久久久久中文字幕1 | 激情视频网页 | 日韩免费视频网站 | 免费人做人爱www的视 | 久久精品亚洲一区二区三区观看模式 | 在线激情小视频 | 91大片网站| 亚洲精品男人天堂 | 五月婷婷黄色 | 久久tv| 在线免费观看亚洲视频 | 天天干天天操天天干 | 丁香六月婷 | 天天摸夜夜添 | 在线观看91视频 | 人人插人人插 | 特级黄色片免费看 | 成人高清av在线 | 在线观看91久久久久久 | 亚洲国产精品va在线看黑人动漫 | 国产成人99av超碰超爽 | 91在线精品视频 | 亚洲日本在线视频观看 | 91精品久久久久久综合乱菊 | 伊人久久婷婷 | 国产黄色精品 | 欧美激情一区不卡 | 国产69精品久久99不卡的观看体验 | 粉嫩一区二区三区粉嫩91 | 亚洲激情在线观看 | 国内精品久久久久久久久久 | av中文字幕av | 欧美大片www| 99re8这里有精品热视频免费 | 91av视频 | 亚洲久草网 | 久久99久久99精品免费看小说 | 在线精品视频免费观看 | 日日操日日插 | 中文字幕在线观看免费 | 97超碰在线资源 | 夜夜澡人模人人添人人看 | 国产一在线精品一区在线观看 | 欧美影院久久 | 国产精品久久久久9999 | 日韩av电影中文字幕在线观看 | 国产视频资源在线观看 | 97国产大学生情侣白嫩酒店 | 六月丁香激情综合 | 91桃色在线观看视频 | 国产乱对白刺激视频在线观看女王 | 国产精品免费观看国产网曝瓜 | 欧美日韩另类在线 | 视频在线观看91 | 久久99在线视频 | 国产视频69 | 国产精品久久久久亚洲影视 | 欧美成a人片在线观看久 | 在线观看视频免费播放 | 男女拍拍免费视频 | 中文字幕免费观看全部电影 | 国产一级在线看 | 欧美va在线观看 | 久久精品艹 | av成人亚洲 | 在线观看免费av网 | 亚洲成人av影片 | 三级在线视频播放 | av黄在线播放| 国产一区二区三区免费在线 | 天天操夜夜拍 | 男女激情免费网站 | 狠狠插天天干 | 久久综合久久综合久久综合 | 黄色小说在线免费观看 | 在线观看免费国产小视频 | 久久久精品福利视频 | 成人免费视频网站 | 亚洲成人av片 | 日批视频在线 | 福利一区二区 | 日韩黄色免费看 | 色偷偷人人澡久久超碰69 | av在线免费播放网站 | 波多野结衣久久资源 | 国产剧在线观看片 | 成人免费网视频 | 九九导航 | 国产精品一区二区白浆 | 午夜精选视频 | 免费黄色av. | 国产精品美女久久 | 国产精品毛片久久蜜 | 精品视频国产一区 | 97偷拍在线视频 | 日韩免费一二三区 | 欧美日韩高清一区二区三区 | 在线精品在线 | 免费av在线播放 | av在线电影播放 | 色婷婷久久 | 久久综合视频网 | www激情久久 | 狠狠网亚洲精品 | 欧美电影在线观看 | 久久久国际精品 | 国产精品扒开做爽爽的视频 | 日韩毛片精品 | 麻豆传媒在线免费看 | 91插插插免费视频 | 国产精品99久久免费黑人 | 99视频精品全部免费 在线 | 一区二区三区在线电影 | 国产午夜精品久久久久久久久久 | 国产小视频免费观看 | 中文字幕久久亚洲 | 欧美一二三视频 | 美女视频是黄的免费观看 | 亚洲欧美日韩一二三区 | 欧美日韩国产欧美 | 五月综合激情 | a视频在线播放 | 99色精品视频 | 国产精品国产亚洲精品看不卡 | 亚洲一区二区三区在线看 | 麻豆国产精品永久免费视频 | 97精品伊人 | 久久艹在线观看 | 精品国产一区二区三区久久久久久 | 9ⅰ精品久久久久久久久中文字幕 | 日b黄色片| 成人一区在线观看 | 久久免费视频在线 | 久久草av| 人人爽人人搞 | 在线观看成人福利 |