日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

(转)WindowsPhone基础琐碎总结-----数据绑定(一)

發(fā)布時(shí)間:2024/8/23 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)WindowsPhone基础琐碎总结-----数据绑定(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文地址:http://www.cnblogs.com/fuchongjundream/archive/2012/04/08/2437803.html

?

一、什么是數(shù)據(jù)綁定
??? 官方這樣解釋:數(shù)據(jù)綁定是在應(yīng)用程序 UI 與業(yè)務(wù)邏輯之間建立連接的過(guò)程。簡(jiǎn)單的理解就是通過(guò)數(shù)據(jù)綁定的方式實(shí)現(xiàn)了后臺(tái)數(shù)據(jù)和前臺(tái)UI元素的關(guān)聯(lián),可以比喻成UI元素和數(shù)據(jù)源的橋梁,更詳細(xì)點(diǎn)的說(shuō)數(shù)據(jù)綁定提供了一種數(shù)據(jù)呈現(xiàn)與交互的簡(jiǎn)捷方式,使得數(shù)據(jù)與UI分離,并能使得數(shù)據(jù)源和UI元素之間的自動(dòng)更新、同步。
???
二、數(shù)據(jù)綁定的幾個(gè)名詞
??? 在正式介紹數(shù)據(jù)綁定之前簡(jiǎn)單說(shuō)幾個(gè)關(guān)于數(shù)據(jù)綁定的常用名詞,我想大家只要看一遍都會(huì)理解什么意思,不需要多說(shuō)。
???? (1)綁定源:即數(shù)據(jù)的來(lái)源,綁定源可以是任意的CLR對(duì)象。不過(guò)實(shí)際需要的時(shí)候則是該對(duì)象的某一特定屬性。
???? (2)綁定目標(biāo):即從綁定源獲得的數(shù)據(jù)綁定到的UI元素。可以是FrameworkElement類(lèi)型的任意對(duì)象,相對(duì)于綁定源,實(shí)際上綁定的是該控件的一個(gè)特定屬性。
???? (3)、綁定模式:這個(gè)也很好理解,a、OneTime:僅僅一次綁定,在綁定創(chuàng)建時(shí)使用源數(shù)據(jù)更新目標(biāo),適用于只顯示數(shù)據(jù)而不進(jìn)行數(shù)據(jù)的更新。簡(jiǎn)單理解為:綁定源僅僅把數(shù)據(jù)給綁定目標(biāo)一次后,兩者變得毫不相關(guān)。b、OneWay:單向綁定,在綁定創(chuàng)建時(shí)或者源數(shù)據(jù)發(fā)生變化時(shí)更新到目標(biāo),適用于顯示變化的數(shù)據(jù)。簡(jiǎn)單理解為數(shù)據(jù)源能把數(shù)據(jù)更新到綁定目標(biāo),而綁定目標(biāo)的變化卻不能影響到數(shù)據(jù)源。 c、TwoWay:雙向綁定,在任何時(shí)候都可以同時(shí)更新源數(shù)據(jù)和目標(biāo)。前兩種綁定方式理解了這個(gè)相對(duì)理解就容易,通俗的講就是綁定源和綁定目標(biāo)是互通的,無(wú)論誰(shuí)的變化都能夠影響到對(duì)方,比如綁定源數(shù)據(jù)有變化就能馬上把綁定目標(biāo)的數(shù)據(jù)更新,反之一樣。
??? (4)綁定對(duì)象:當(dāng)綁定目標(biāo)需要綁定數(shù)據(jù)源時(shí)該借助什么呢?綁定對(duì)象來(lái)完成,可以比喻成中介,起了個(gè)名字:Binding。這個(gè)對(duì)象有三個(gè)重要屬性(它們當(dāng)然與綁定源,綁定目標(biāo)等有關(guān)系,畢竟它是兩者的中介):a、Source:字面意思就能知道指的是綁定源對(duì)象 b、RelativeSource:指定綁定源相對(duì)于綁定目標(biāo)的位置來(lái)標(biāo)識(shí)綁定源 c、ElementName,綁定源也是UI對(duì)象時(shí)候,設(shè)置其綁定源的的名稱(chēng)即可。說(shuō)了這三種屬性,其主要的目的就是找到綁定源,因?yàn)锽inding一般會(huì)寫(xiě)在綁定目標(biāo)中,這樣只要找到綁定源就好了,這樣就能把兩者聯(lián)系起來(lái)。這三個(gè)屬性的功能就是找到綁定源。所以這三種方式指定任意一種即可,只要讓中介binding找到綁定源就好了。不過(guò)事實(shí)上我們?cè)趯?xiě)程序的過(guò)程中很少這么用的,微軟提供了一個(gè)更加通用的方法就是:通過(guò)設(shè)置UI元素的DataContext屬性來(lái)制定綁定源,這樣以上三個(gè)屬性都無(wú)需指定,下文我會(huì)在做些介紹。
??? (5)Path(路徑):Binding對(duì)象的一個(gè)屬性,來(lái)指示綁定源對(duì)象中用以提供數(shù)據(jù)的屬性。
三、通過(guò)實(shí)例理解基本數(shù)據(jù)綁定
??? 下面我會(huì)通過(guò)在頁(yè)面上綁定一個(gè)學(xué)生信息,來(lái)逐步探究數(shù)據(jù)綁定。
??? 1、基本數(shù)據(jù)綁定
???? (1)我有這樣一個(gè)需求想把一個(gè)學(xué)生信息綁定到UI界面上,我們?cè)撊绾螌?shí)現(xiàn)?首先考慮UI界面上的元素,這個(gè)不用多說(shuō),直接上圖如下:

(2)簡(jiǎn)單說(shuō)明下,布局很簡(jiǎn)單,canvas里面包含著一個(gè)Image控件(顯示學(xué)生照片),9個(gè)TextBlock控件用來(lái)顯示學(xué)生相關(guān)信息,還有兩個(gè)button按鈕,當(dāng)我們點(diǎn)擊小紅和小明時(shí)分別顯示他們的信息到UI控件。主要xaml代碼如下:

<phone:PhoneApplicationPage
x:Class="數(shù)據(jù)綁定實(shí)例1.MainPage"
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone
="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell
="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable
="d" d:DesignWidth="480" d:DesignHeight="768"
FontFamily
="{StaticResource PhoneFontFamilyNormal}"
FontSize
="{StaticResource PhoneFontSizeNormal}"
Foreground
="{StaticResource PhoneForegroundBrush}"
SupportedOrientations
="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible
="True">


<!--LayoutRoot 是包含所有頁(yè)面內(nèi)容的根網(wǎng)格-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>

<!--TitlePanel 包含應(yīng)用程序的名稱(chēng)和頁(yè)標(biāo)題-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="數(shù)據(jù)綁定實(shí)例" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="學(xué)生信息" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>

<!--ContentPanel - 在此處放置其他內(nèi)容-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Button Content="小紅" Height="72" HorizontalAlignment="Left" Margin="29,337,0,0" Name="buttonXiaohong" VerticalAlignment="Top" Width="160" Click="buttonXiaohong_Click" />
<Button Content="小明" Height="72" HorizontalAlignment="Left" Margin="232,337,0,0" Name="buttonXiaoming" VerticalAlignment="Top" Width="160" Click="buttonXiaoming_Click" />
</Grid>
<Canvas Height="253" HorizontalAlignment="Left" Margin="21,54,0,0" Name="canvas1" VerticalAlignment="Top" Width="441" Grid.Row="1">
<Image Height="150" Name="image1" Stretch="Fill" Width="164" Canvas.Left="20" Canvas.Top="50" />
<TextBlock Height="30" Name="textBlockName" Text="" Canvas.Left="269" Canvas.Top="50" />
<TextBlock Height="30" Name="textBlockSex" Text="" Canvas.Left="269" Canvas.Top="86" />
<TextBlock Height="30" Name="textBlockAge" Text="" Canvas.Left="269" Canvas.Top="121" />
<TextBlock Height="30" Name="textBlockBirthday" Text="" Canvas.Left="309" Canvas.Top="157" />
<TextBlock Height="30" Name="textBlockBlog" Text="博客地址:" Canvas.Left="20" Canvas.Top="206" />
<TextBlock Canvas.Left="203" Canvas.Top="50" Height="30" Name="textBlock1" Text="姓名:" />
<TextBlock Canvas.Left="203" Canvas.Top="86" Height="30" Name="textBlock2" Text="性別:" />
<TextBlock Canvas.Left="203" Canvas.Top="121" Height="30" Name="textBlock3" Text="年齡:" />
<TextBlock Canvas.Left="203" Canvas.Top="157" Height="30" Name="textBlock4" Text="出生日期:" />
</Canvas>
</Grid>
</phone:PhoneApplicationPage>

? (3)UI設(shè)計(jì)好了,在準(zhǔn)備下資源,兩個(gè)人需要兩張圖片了(MM.jpg和GG.jpg),網(wǎng)上隨便找的,加入項(xiàng)目中去,下一步當(dāng)然是把頁(yè)面抽象成類(lèi)了,下面我們將新建一個(gè)學(xué)生類(lèi),作為基本的數(shù)據(jù)源。代碼如下:

namespace 數(shù)據(jù)綁定實(shí)例1
{
public class Student
{
public string Name { set; get; }
public string Sex { set; get; }
public int Age { set; get; }
public string Birthday { set; get; }
public BitmapImage Picture { set; get; }
public string Blog { set; get; }
}
}

(4)現(xiàn)在我們開(kāi)始構(gòu)造小紅和小明這兩個(gè)人,并給出他們的具體信息,代碼如下:

Student Xiaohong = new Student()
{
Name = "小紅",
Sex = "",
Age = 20,
Birthday = "1988/8/1",
Picture =new BitmapImage(new Uri("MM.jpg",UriKind.RelativeOrAbsolute)),
Blog = "http://home.cnblogs.com/u/fuchongjundream/"
};
Student Xiaoming = new Student()
{
Name = "小明",
Sex = "",
Age = 22,
Birthday = "1989/6/30",
Picture =new BitmapImage(new Uri("GG.jpg",UriKind.RelativeOrAbsolute)),
Blog = "http://home.cnblogs.com/u/fuchongjundream/"
};

(5)下面剩余的關(guān)鍵問(wèn)題就是把美女和帥哥的信息綁定到UI控件了。綁定代碼如下:
? 首先引入命名空間:using System.Windows.Data;因?yàn)锽inding對(duì)象在這個(gè)命名空間下。
? 在buttonXiaohong_Click中加入如下代碼:

private void buttonXiaohong_Click(object sender, RoutedEventArgs e)
{
//綁定名字
Binding bdName = new Binding();

bdName.Source = Xiaohong;
bdName.Path = new PropertyPath("Name");
this.textBlockName.SetBinding(TextBlock.TextProperty, bdName);

//綁定性別
Binding bdSex = new Binding();

bdSex.Source = Xiaohong;
bdSex.Path = new PropertyPath("Sex");
this.textBlockSex.SetBinding(TextBlock.TextProperty, bdSex);

//綁定年齡
Binding bdAge = new Binding();

bdAge.Source = Xiaohong;
bdAge.Path = new PropertyPath("Age");
this.textBlockAge.SetBinding(TextBlock.TextProperty, bdAge);

//綁定生日
Binding bdBirthday = new Binding();

bdBirthday.Source = Xiaohong;
bdBirthday.Path = new PropertyPath("Birthday");
this.textBlockBirthday.SetBinding(TextBlock.TextProperty, bdBirthday);
// 綁定照片
Binding bdPicture = new Binding();

bdPicture.Source = Xiaohong;
bdPicture.Path = new PropertyPath("Picture");
this.image1.SetBinding(Image.SourceProperty, bdPicture);
// 綁定博客地址
Binding bdBlog = new Binding();

bdBlog.Source = Xiaohong;
bdBlog.Path = new PropertyPath("Blog");
this.textBlockBlog.SetBinding(TextBlock.TextProperty, bdBlog);
}

(6)現(xiàn)在我們可以運(yùn)行下看看,單擊小紅,效果圖如下:

? (7)很高興我們實(shí)現(xiàn)了我們想要的結(jié)果,小明的綁定和小紅的道理一樣,我不在贅述,通過(guò)上面我們可以總結(jié)出綁定的一般步驟:
第一步:實(shí)例化一個(gè)綁定對(duì)象(找到中介);第二步:設(shè)置綁定對(duì)象的Source 屬性,即設(shè)定綁定源(數(shù)據(jù)來(lái)源的地方);第三步:設(shè)置綁定路徑,即綁定到綁定源的那個(gè)屬性;第四步調(diào)用UI控件的綁定方法實(shí)現(xiàn)綁定,即實(shí)現(xiàn)把數(shù)據(jù)綁定到綁定目標(biāo)的那個(gè)屬性。以上是基本的數(shù)據(jù)綁定流程,也是數(shù)據(jù)綁定的基礎(chǔ)。也許你還有些疑問(wèn):比如沒(méi)有設(shè)置Mode、Convert屬性,沒(méi)有設(shè)置說(shuō)明取了默認(rèn)值,Mode默認(rèn)為OneWay,Convert沒(méi)有設(shè)置說(shuō)明沒(méi)有需要數(shù)據(jù)轉(zhuǎn)化,下文我也將會(huì)介紹。
?? 2、通過(guò)DataContext(數(shù)據(jù)上下文)屬性指定數(shù)據(jù)源
通過(guò)上面的例子知道我們通過(guò)Binding對(duì)象實(shí)現(xiàn)了疏浚到UI的綁定,但是我們寫(xiě)代碼時(shí)很明顯意識(shí)到了代碼有很多的冗余,比如說(shuō) bdPicture.Source = Xiaohong;設(shè)置綁定源是重復(fù)的。鑒于此,我們還可以用另一種方式設(shè)置數(shù)據(jù)源的方式,即通過(guò)UI元素的數(shù)據(jù)上下文DataContext屬性來(lái)指定數(shù)據(jù)源。開(kāi)始接觸DataContext可能不好理解,我簡(jiǎn)單說(shuō)下我的理解:一般來(lái)說(shuō)每個(gè)UI控件都是有父類(lèi)控件的,比如我們上面所用到的image,textblock,button控件父控件是Canvas,Canvas的父控件是Grid;每個(gè)控件都會(huì)有DataContext屬性,因?yàn)槊糠N控件都繼承自FramworkElement,一旦我們指定了這個(gè)屬性,其子元素控件在不指定Source和DataContext情況下,都默認(rèn)使用該屬性指定對(duì)象作為綁定源。那上面例子說(shuō),我們要是設(shè)置Canvas控件的DataContext為小紅:this.canvas1.DataContext = Xiaohong;那么canvas子控件在沒(méi)有指定DataContext 屬性情況下,都默認(rèn)使用Xiaohong作為數(shù)據(jù)源。再深層次理解下,其實(shí)只要設(shè)置了父類(lèi)控件的DataContext 屬性后,程序會(huì)自動(dòng)通過(guò)遍歷樹(shù)(內(nèi)部數(shù)據(jù)結(jié)構(gòu)為樹(shù))而找到要綁定數(shù)據(jù)源的合適屬性。甚至來(lái)說(shuō)可以設(shè)置整個(gè)頁(yè)面的DataContext為Xiaohong,當(dāng)然一般我們不會(huì)這么做。實(shí)際上我們一般的做法是先用DataContext指定高層的元素的數(shù)據(jù)上下文,然后對(duì)特殊的子元素再另行指定綁定源。
???? 通過(guò)以上解釋,我們很容易理解可以把上面例子的代碼作如下改進(jìn):去掉所有的設(shè)置綁定源的語(yǔ)句,我們只用指定this.canvas1.DataContext = Xiaohong;即可實(shí)現(xiàn)同樣的功能。
??? 3、通過(guò)XAML代碼實(shí)現(xiàn)綁定
??? 以上例子都是通過(guò)C#代碼后臺(tái)綁定,當(dāng)然我們也可以通過(guò)XAML代碼更容易的實(shí)現(xiàn)綁定。綁定語(yǔ)法說(shuō)下:<UI標(biāo)記 綁定屬性="{Binding Path=*,Mode=*,Convert+*,Source=*;}"/>,下面我們還以上面例子為例子通過(guò)XAML來(lái)綁定小紅和小明。下面我僅僅貼出改動(dòng)過(guò)得代碼:

<Canvas Height="253" HorizontalAlignment="Left" Margin="21,54,0,0" Name="canvas1" VerticalAlignment="Top" Width="441" Grid.Row="1">
<Image Height="150" Name="image1" Stretch="Fill" Width="164" Canvas.Left="20" Canvas.Top="50" Source="{Binding Path=Picture}" />
<TextBlock Height="30" Name="textBlockName" Text="{Binding Path=Name}" Canvas.Left="269" Canvas.Top="50" />
<TextBlock Height="30" Name="textBlockSex" Text="{Binding Path=Sex}" Canvas.Left="269" Canvas.Top="86" />
<TextBlock Height="30" Name="textBlockAge" Text="{Binding Path=Age}" Canvas.Left="269" Canvas.Top="121" />
<TextBlock Height="30" Name="textBlockBirthday" Text="{Binding Path=Birthday}" Canvas.Left="309" Canvas.Top="157" />
<TextBlock Height="30" Name="textBlockBlog" Text="{Binding Path=Blog}" Canvas.Left="20" Canvas.Top="206" />
<TextBlock Canvas.Left="203" Canvas.Top="50" Height="30" Name="textBlock1" Text="姓名:" />
<TextBlock Canvas.Left="203" Canvas.Top="86" Height="30" Name="textBlock2" Text="性別:" />
<TextBlock Canvas.Left="203" Canvas.Top="121" Height="30" Name="textBlock3" Text="年齡:" />
<TextBlock Canvas.Left="203" Canvas.Top="157" Height="30" Name="textBlock4" Text="出生日期:" />
</Canvas>

當(dāng)然數(shù)據(jù)源的指定我們?nèi)匀煌ㄟ^(guò)Canvas的DataContext屬性在C#代碼中指定:

private void buttonXiaohong_Click(object sender, RoutedEventArgs e)
{

this.canvas1.DataContext = Xiaohong;
}

private void buttonXiaoming_Click(object sender, RoutedEventArgs e)
{

this.canvas1.DataContext = Xiaoming;
}

效果圖如下:

4、數(shù)據(jù)轉(zhuǎn)換器(Converter)的使用。
?? 如果認(rèn)真看完代碼的同學(xué)肯定會(huì)注意到Picture這個(gè)屬性,我用的是BitmapImage類(lèi)型,實(shí)例化學(xué)生對(duì)象,對(duì)Picture屬性這樣賦值:Picture =new BitmapImage(new Uri("GG.jpg",UriKind.RelativeOrAbsolute)),這樣雖成功實(shí)現(xiàn)了,但總感覺(jué)有點(diǎn)不妥。我們一般會(huì)把圖片的地址存為字符串類(lèi)型,但是UI控件Source屬性卻需要的是BitmapImage類(lèi)型。該如何解決這個(gè)矛盾呢?數(shù)據(jù)轉(zhuǎn)換器來(lái)幫您解決。
?? 根據(jù)上面的敘述和需求我們不難總結(jié)出轉(zhuǎn)換器的作用:當(dāng)綁定源提供的數(shù)據(jù)格式或者類(lèi)型與綁定目標(biāo)所需不一致時(shí)就需要通過(guò)一個(gè)轉(zhuǎn)換器來(lái)進(jìn)行轉(zhuǎn)換。Converter的類(lèi)型其實(shí)是一個(gè)實(shí)現(xiàn)了IValueConverter接口的類(lèi)。IValueConverter接口中定義了兩個(gè)方法Convert和ConvertBack用來(lái)對(duì)數(shù)據(jù)的雙向轉(zhuǎn)換。從字面意思很容易理解,我不在多說(shuō)。本實(shí)例中我們需要的是想把string類(lèi)型的地址轉(zhuǎn)換為BitMapImage類(lèi)型,不需要雙向的轉(zhuǎn)換,所以我僅僅實(shí)現(xiàn)IValueConverter接口中的Convert方法。
?? 首先新建一個(gè)轉(zhuǎn)換類(lèi):string類(lèi)型到BitMapImage類(lèi)型,并實(shí)現(xiàn)IValueConverter接口,需要注意的是:引入using System.Windows.Data命名空間,IValueConverter在此命名空間。
第一步:

using System;
using System.Windows.Data;
using System.Windows.Media.Imaging;
namespace 數(shù)據(jù)綁定實(shí)例1
{
public class StringToBitMapImage:IValueConverter
{
#region IValueConverter 成員
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//value為object類(lèi)型,需強(qiáng)制轉(zhuǎn)換(string)value
BitmapImage picture = new BitmapImage(new Uri((string)value, UriKind.RelativeOrAbsolute));

return picture;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
}

代碼我就不解釋了,我想大家都會(huì)很容易的理解。
第二步:定義好了轉(zhuǎn)換類(lèi),下面就是我們?cè)撊绾斡昧?
a、我們需要在XAML頁(yè)面引入此類(lèi)的名字空間,并指定一個(gè)key。在<phone:PhoneApplicationPage />中引入命名空間:

xmlns:my="clr-namespace:數(shù)據(jù)綁定實(shí)例1"

b、接著把此轉(zhuǎn)換類(lèi)定義為一個(gè)靜態(tài)資源,我定義為Canvas控件的靜態(tài)資源,當(dāng)然你也可以定義為Grid,甚至整個(gè)頁(yè)面,這是資源樣式的知識(shí)我不再細(xì)說(shuō)。

<Canvas.Resources>
<my:StringToBitMapImage x:Key="StringToBitMapImageKey"></my:StringToBitMapImage>
</Canvas.Resources>

我們可以通過(guò)指定的Key來(lái)訪問(wèn)轉(zhuǎn)換類(lèi)。
c、最后就是轉(zhuǎn)換器了的使用了:

<Image Height="150" Name="image1" Stretch="Fill" Width="164" Canvas.Left="20" Canvas.Top="50" Source="{Binding Path=Picture,
Converter={StaticResource StringToBitMapImageKey}}
" />

d、完成以上代碼后我們回到C#代碼中把Picture屬性統(tǒng)一的改為String類(lèi)型,然后F5,結(jié)果和原來(lái)一樣,我們成功實(shí)現(xiàn)了轉(zhuǎn)換。改動(dòng)的地方如下:

public class Student
{
public string Name { set; get; }
public string Sex { set; get; }
public int Age { set; get; }
public string Birthday { set; get; }
public string Picture { set; get; }
public string Blog { set; get; }
}
Student Xiaohong = new Student()
{
Name = "小紅",
Sex = "女",
Age = 20,
Birthday = "1988/8/1",
Picture ="MM.jpg",
Blog = "http://home.cnblogs.com/u/fuchongjundream/"
};
Student Xiaoming = new Student()
{
Name = "小明",
Sex = "男",
Age = 22,
Birthday = "1989/6/30",
Picture ="GG.jpg",
Blog = "http://home.cnblogs.com/u/fuchongjundream/"
};
this.canvas1.DataContext = Xiaoming;

通過(guò)這個(gè)小例子我想我們能夠知道了轉(zhuǎn)換器的用法,需要說(shuō)明的是轉(zhuǎn)換器不僅可以實(shí)現(xiàn)這些簡(jiǎn)單的類(lèi)型轉(zhuǎn)換、格式轉(zhuǎn)換,甚至可以轉(zhuǎn)換一些更為復(fù)雜的邏輯轉(zhuǎn)換,當(dāng)然道理都是大同小異。
5、數(shù)據(jù)綁定模式
?? 開(kāi)篇已經(jīng)做了相關(guān)介紹,我就不再做詳細(xì)說(shuō)明,僅僅簡(jiǎn)單說(shuō)下,前面我們沒(méi)有設(shè)置綁定模式,默認(rèn)情況下都是OneWay。OneTime屬于與一次性綁定很好理解,用到的也很少。TwoWay屬于雙向綁定,可以實(shí)現(xiàn)數(shù)據(jù)在數(shù)據(jù)源與綁定目標(biāo)之間可以相互流動(dòng),也即源與目標(biāo)任何一方發(fā)生改變都會(huì)立即通知到對(duì)方并引起對(duì)方數(shù)據(jù)的更新,可以說(shuō)是實(shí)時(shí)同步的。下面通過(guò)實(shí)例主要說(shuō)明下TwoWay綁定原理。
?? 為了還是用上面的例子,我們需要再加入一個(gè)沒(méi)有什么實(shí)際意義的TextBox控件,僅僅為了做演示(上面用的控件都是沒(méi)法改變其綁定值的)。在Canvas再放置一個(gè)TextBox控件,并綁定Name屬性,如下圖:

XamL代碼如下:

<TextBox Canvas.Left="6" Canvas.Top="242" Height="74" Name="textBoxName" Text="{Binding Path=Name}" Width="429" />

???? 運(yùn)行下,順利把小紅的名字信息綁定到了TextBox控件中,這也就是說(shuō)實(shí)現(xiàn)了默認(rèn)的OneWay,可是我們?cè)撊绾胃腡extBox的值同時(shí)更新到數(shù)據(jù)源呢?在正式開(kāi)始寫(xiě)代碼之前我們還需要了解,當(dāng)選擇OneWay或者TowWay時(shí)候,為了綁定源的的變化能夠?qū)崟r(shí)的通知到綁定目標(biāo),源對(duì)象必須實(shí)現(xiàn)INotifyPropertyChanged接口(這個(gè)接口在using System.ComponentModel命名空間下,記得加入)。換句話說(shuō)如果使綁定目標(biāo)的顯示與綁定源的同步,必須滿足兩個(gè)條件:一是設(shè)定綁定模式為OneWay或者TwoWay;而是綁定源實(shí)現(xiàn)INotifyPropertyChanged接口。下面我們通過(guò)實(shí)例具體演示:
第一步:源對(duì)象實(shí)現(xiàn)INotifyPropertyChanged接口

namespace 數(shù)據(jù)綁定實(shí)例1
{
public class Student:INotifyPropertyChanged
{
private string name;
public string Name
{
set
{
this.name = value;
NotifyPropertyChanged("Name");
}
get
{
return this.name;
}
}
public string Sex { set; get; }
public int Age { set; get; }
public string Birthday { set; get; }
public string Picture { set; get; }
public string Blog { set; get; }

#region INotifyPropertyChanged 成員

public event PropertyChangedEventHandler PropertyChanged;

#endregion
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged!=null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

}
}
}
}

說(shuō)明:上面代碼我僅僅貼出了Name屬性的相關(guān)代碼,其他屬性與其類(lèi)同,讀者可自行加上。其實(shí)簡(jiǎn)單的理解就是每當(dāng)綁定源的相關(guān)屬性發(fā)生改變時(shí)候,綁定源通過(guò)以上的通知機(jī)制告訴綁定目標(biāo)“我改變了,你如果是TwoWay或者是OneWay,你也趕緊改變吧”。
第二步:設(shè)置綁定模式

<TextBox Canvas.Left="6" Canvas.Top="242" Height="74" Name="textBoxName" Text="{Binding Path=Name, Mode=TwoWay}" Width="429" />

好了,現(xiàn)在我們運(yùn)行程序看看會(huì)有什么變化,程序啟動(dòng)后單擊小紅:

改變下TextBox的內(nèi)容,然再單擊小紅看看會(huì)有什么情況發(fā)生?在預(yù)料之中當(dāng)我們修改完TextBox的內(nèi)容后,姓名被改變了,這也正是我們想要的結(jié)果。

細(xì)心的你這時(shí)可能再會(huì)單擊下小紅,甚至單擊小明后再單擊小紅,發(fā)現(xiàn)“小紅”這個(gè)名字再也回不來(lái)了,因?yàn)閿?shù)據(jù)源發(fā)生了改變。也許你還會(huì)問(wèn)照片左邊的姓名我們沒(méi)有設(shè)定綁定模式啊,怎么也改變了。是的我們沒(méi)有設(shè)定,但系統(tǒng)默認(rèn)OneWay的。其實(shí)過(guò)程簡(jiǎn)單的是這樣的:我改變了TextBox的內(nèi)容,因?yàn)樗蛿?shù)據(jù)源是TwoWay方式所以,它將會(huì)通知數(shù)據(jù)源我改變了你也改變吧,然后數(shù)據(jù)源就改變了,數(shù)據(jù)源改變了他當(dāng)然要通知實(shí)現(xiàn)OneWay的照片旁邊的姓名,我被TextBox改變了,你也跟著改變吧。其實(shí)也算是個(gè)連鎖反應(yīng),好了不解釋了,應(yīng)該能理解的。
???? 好了,可以結(jié)尾了,終于把基本的數(shù)據(jù)綁定通過(guò)實(shí)例的方式講解完了,當(dāng)然這在實(shí)際運(yùn)用當(dāng)中還是遠(yuǎn)遠(yuǎn)不夠的,隨后我將在WindowsPhone基礎(chǔ)瑣碎總結(jié)-----數(shù)據(jù)綁定(二)中介紹集合對(duì)象的數(shù)據(jù)綁定,敬請(qǐng)關(guān)注。

---------------------------------------------------------------------------------------------------------------------------------------------

作者:GavinDream(GavinDream主頁(yè) 博客園)
出處:http://www.cnblogs.com/fuchongjundream/
任何轉(zhuǎn)載必須保留完整文章,在顯要地方顯示署名以及原文鏈接。如您有任何疑問(wèn)或者授權(quán)方面的協(xié)商,請(qǐng)發(fā)郵件給我 或者 留言。

轉(zhuǎn)載于:https://www.cnblogs.com/fcsh820/archive/2012/05/09/2491848.html

總結(jié)

以上是生活随笔為你收集整理的(转)WindowsPhone基础琐碎总结-----数据绑定(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。