生活随笔
收集整理的這篇文章主要介紹了
数据绑定的基础
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
先用一個最簡單的例子來演示數(shù)據(jù)綁定。
新建一個項目TestData來測試,拖拽兩個控件到屏幕上:TextBox和Slider。
給Slider的Name設(shè)置為slider1,然后我們給兩個控件之間添加數(shù)據(jù)綁定,使得TextBox始終顯示滑動條內(nèi)的進度值。
然后給Text屬性添加數(shù)據(jù)綁定,并且指定對象為slider1,完整代碼如下:
[html] view plaincopy
<Grid?Background="{StaticResource?ApplicationPageBackgroundThemeBrush}">?????????<TextBox?HorizontalAlignment="Center"?Margin="0,-100,0,0"?TextWrapping="Wrap"???????????????????Text="{Binding?Value,?Mode=TwoWay,?ElementName=slider1}"?VerticalAlignment="Center"/>?????????<Slider?x:Name="slider1"?HorizontalAlignment="Center"?VerticalAlignment="Center"?Width="200"?Height="30"/>???????</Grid>??
運行的結(jié)果就是1.拖動滑塊時文本框的數(shù)值也隨之改變2.文本框內(nèi)容改變時滾動條也會跟著改變,這就是TwoWay:
那么怎么自己去寫數(shù)據(jù)綁定呢?
新建一個Person類來試驗一下。
[csharp] view plaincopy
using?System;??using?System.Collections.Generic;??using?System.Linq;??using?System.Text;??using?System.Threading.Tasks;????namespace?TestData??{??????class?Person??????{??????????public?string?Name??????????{??????????????get;??????????????set;??????????}????????????public?int?Age??????????{??????????????get;??????????????set;??????????}??????}??}??
然后在主頁面拖拽一個TextBox和兩個按鈕,一個按鈕用來讀出Person的值,一個是用來修改Person的值:
先給TextBox命名為text1以便后面使用。
雙擊讀取的按鈕,跳轉(zhuǎn)到了后臺的c#文件。
在類中聲明一個Person對象:? ? ? ? Person myPerson = new Person();
然后在OnNavigatedTo方法中判斷,如果是NavigationMode.New則設(shè)置text1的DataContent為前面聲明的myPerson。
這里可以把DataContent理解為數(shù)據(jù)源。
然后點擊按鈕的監(jiān)聽方法里,將讀取到的Person內(nèi)容顯示出來,在點擊第二個按鈕的時候?qū)erson的name顯示為當前的毫秒數(shù)值。
完整的代碼如下:
[csharp] view plaincopy
using?System;??using?System.Collections.Generic;??using?System.IO;??using?System.Linq;??using?Windows.Foundation;??using?Windows.Foundation.Collections;??using?Windows.UI.Popups;??using?Windows.UI.Xaml;??using?Windows.UI.Xaml.Controls;??using?Windows.UI.Xaml.Controls.Primitives;??using?Windows.UI.Xaml.Data;??using?Windows.UI.Xaml.Input;??using?Windows.UI.Xaml.Media;??using?Windows.UI.Xaml.Navigation;????????namespace?TestData??{????????????????????????public?sealed?partial?class?MainPage?:?Page??????{????????????Person?myPerson?=?new?Person(){?Name?=?"why"?,?Age?=?20?};??????????public?MainPage()??????????{??????????????this.InitializeComponent();??????????}??????????????????????????????????????????????????????????????protected?override?void?OnNavigatedTo(NavigationEventArgs?e)??????????{??????????????if?(e.NavigationMode?==?NavigationMode.New)??????????????{??????????????????text1.DataContext?=?myPerson;??????????????}??????????}????????????private?void?Button_Click_1(object?sender,?RoutedEventArgs?e)??????????{??????????????MessageDialog?myDialog?=?new?MessageDialog(myPerson.Name);??????????????myDialog.ShowAsync();??????????}????????????private?void?Button_Click_2(object?sender,?RoutedEventArgs?e)??????????{??????????????myPerson.Name?=?DateTime.Now.Millisecond.ToString();??????????}??????}??}??
然后在xaml頁面設(shè)置textbox的數(shù)據(jù)綁定,將其綁定到數(shù)據(jù)源的Name屬性上(前面設(shè)置的數(shù)據(jù)源):
完整的xaml代碼如下:
[html] view plaincopy
<Page??????x:Class="TestData.MainPage"??????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"??????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"??????xmlns:local="using:TestData"??????xmlns:d="http://schemas.microsoft.com/expression/blend/2008"??????xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"??????mc:Ignorable="d">????????<Grid?Background="{StaticResource?ApplicationPageBackgroundThemeBrush}">??????????<TextBox?x:Name="text1"?HorizontalAlignment="Center"?Margin="0,0,0,0"?TextWrapping="Wrap"????????????????????Text="{Binding?Name}"?VerticalAlignment="Center"/>??????????<Button?Content="讀取"?HorizontalAlignment="Center"?Margin="0,-100,0,0"?VerticalAlignment="Center"?Click="Button_Click_1"/>??????????<Button?Content="改變"?HorizontalAlignment="Center"?Margin="0,100,0,0"?VerticalAlignment="Center"?Click="Button_Click_2"/>??????</Grid>??</Page>??
運行項目,發(fā)現(xiàn)顯示的是why,但是點擊修改之后textbox中的值并沒有改變,因為text不知道其中發(fā)生了變化。
那么如何在Name發(fā)生變化的時候立即得知?
我們需要修改Person這個類。
在數(shù)據(jù)綁定中,建議大家實現(xiàn)一個INotifyPropertyChanged接口。
它只有一個成員,就是PropertyChanged事件。
將set稍作修改即可。完整的Person.cs文件如下:
[csharp] view plaincopy
using?System;??using?System.Collections.Generic;??using?System.ComponentModel;??using?System.Linq;??using?System.Text;??using?System.Threading.Tasks;????namespace?TestData??{??????class?Person?:?INotifyPropertyChanged??????{??????????private?string?_name;??????????public?string?Name??????????{??????????????get??????????????{??????????????????return?_name;??????????????}??????????????set??????????????{??????????????????_name?=?value;??????????????????if?(PropertyChanged?!=?null)??????????????????{??????????????????????PropertyChanged(this,?new?PropertyChangedEventArgs("Name"));??????????????????}??????????????}??????????}????????????private?int?_age;??????????public?int?Age??????????{??????????????get??????????????{??????????????????return?_age;??????????????}??????????????set??????????????{??????????????????_age?=?value;??????????????????if?(PropertyChanged?!=?null)??????????????????{??????????????????????PropertyChanged(this,?new?PropertyChangedEventArgs("Age"));??????????????????}??????????????}??????????}????????????public?event?PropertyChangedEventHandler?PropertyChanged;??????}??}??
此時再運行,點擊修改的時候TextBox里面就會跟著變化了。
順便說一下,綁定模式一共分三種,
- OneTime:一次綁定
- OneWay:單向綁定
- TwoWay:雙向綁定
子控件會默認繼承父控件的綁定數(shù)據(jù),這就是數(shù)據(jù)上下文的概念。
比如上面說到的綁定數(shù)據(jù)源,也可以寫成:this.DataContext = myPerson;
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的数据绑定的基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。