[深入浅出WP8.1(Runtime)]数据绑定的基础

11.1 数据绑定的基础

数据绑定是一种XAML界面和后台数据通信的方式,因为界面和后台数据的通信的场景有多种,并且数据于数据之间也存在着不一样的关联关系,所以数据绑定的实现技巧和方式也是多种多样的。下面我们全面地介绍数据绑定的实现原理和相关的语法基础。

11.1.1 数据绑定的原理

数据绑定主要包含两大模块,一是绑定目标,也就是UI界面这块,另一模块是绑定源,也就是给数据绑定提供数据的后台代码。然后这两大模块通过某种方式和语法关联起来,会互相影响或者只是一边对另一边产生影响,这就是数据绑定的基本原理。如图11.1所示,详细地描述了这一绑定的过程,不论要绑定什么元素,不论数据源的特性是什么,每个绑定都始终遵循这个图的模型。

图11.1 数据绑定示意图

如图数据绑定示意图所示,数据绑定实质上是绑定目标与绑定源之间的桥梁。 该图演示以下基本的Windows Phone数据绑定概念:

通常,每个绑定都具有四个组件:绑定目标对象、目标属性、绑定源,以及要使用的绑定源中的值的路径。例如,如果要将TextBox的内容绑定到Employee对象的Name属性,则目标对象是TextBox,目标属性是Text属性,要使用的值是Name,源对象是 Employee 对象。

绑定源又称为数据源,充当着一个数据中心的角色,是数据绑定的数据提供者,可以理解为最底下数据层。数据源是数据的来源和源头,它可以是一个UI元素对象或者某个类的实例,也可以是一个集合。

数据源作为一个实体可能保存着很多数据,具体关注它的哪个数值呢?这个数值就是路径(Path)。例如,要用一个Slider控件作为一个数据源,那么这个Slider控件会有很多属性,这些属性都是作为数据源来提供的,它拥有很多数据,除了Value之外,还有Width、Height等,这时候数据绑定就要选择一个最关心的属性来作为绑定的路径。例如,使用的数据绑定是为了监测Slider控件的值的变化,那么就需要把Path设为Value了。使用集合作为数据源的道理也是一样,Path的值就是集合里面的某个字段。

数据将传送到哪里去?这就是数据的目标,也就是数据源对应的绑定对象。绑定目标对象一定是数据的接收者、被驱动者,但它不一定是数据的显示者。目标属性则是绑定目标对象的属性,这个很好理解。目标属性必须为依赖项属性。大多数UIElement对象的属性都是依赖项属性,而大多数依赖项属性(除了只读属性)默认情况下都支持数据绑定。注意只DependencyObject类型可以定义依赖项属性,所有UIElement都派生自DependencyObject。

11.1.2 创建绑定

在Windows Phone的应用程序中创建一个数据绑定主要会有下面的三个步骤:

(1)定义源对象:源对象会给界面UI提供数据,在这一步就要创建与程序相关的数据类,通过这个类的对象来作为数据绑定的源。

(2)通过设置DataContext属性绑定到源对象, DataContext属性表示Windows Phone的UI元素的数据上下文,可以给UI元素提供数据,如果对当前的页面最顶层的Page设置其DataContext属性绑定到源对象,那么整个页面都可是使用该数据源提供的数据。

(3)使用Binding标记扩展来绑定数据源对象的属性,把UI的属性和数据源的属性关联起来。Binding是标记扩展,可以用Binding来声明包含一系列子句,这些子句跟在Binding关键字后面,并由逗号分隔。

下面给出创建绑定的示例:通过一个最简单的数据绑定程序来理解创建绑定的步骤。

代码清单11-1创建绑定(源代码:第11章\Examples_11_1)

首先定义源对象,创建了一个MyData类,该类里面只有一个字符床属性Title,在这里要注意的是要实现绑定必须是属性类型,如果只是Title变量那么是实现不了绑定的。

MyData.cs文件主要代码
----------------------------------------------------------------------------------------
    public class MyData
    {
        public string Title { get; set; }
    }

然后我们再创建一个MyData类的对象,把该对象赋值给Page页面的DataContext属性,表示使用了这个对象作为该页面的数据上下文,在该页面里面就可以绑定MyData类对象的相关属性了。

MainPage.xaml.cs文件主要代码
----------------------------------------------------------------------------------------
    public MyData myData = new MyData { Title = "这是绑定的标题!" };
    public MainPage()
    {
         this.InitializeComponent();
         this.DataContext = myData;
    }

最后在界面上使用Binding实现UI和数据源属性之间的绑定关系,如在示例中把TextBlock控件的Text属性绑定到MyData对象的Title属性,这样就可以把Title属性的字符串显示在TextBlock控件上了。

MainPage.xaml文件主要代码
----------------------------------------------------------------------------------------
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock Text="{Binding Title}"  Margin="12,100,0,28"  FontSize="50"></TextBlock>
    </Grid>

11.1.3 用元素值绑定

在上一小节里面我们的数据绑定源是一个自定义的数据对象,那么其实还可以使用UI控件的元素对象作为数据源,这样就可以实现了用元素值实现的数据绑定。用元素值进行绑定就是将某一个控件元素作为绑定的数据源,绑定的对象是控件元素,而绑定的数据源同时也是控件元素,这种绑定的方式,可以轻松地实现两个控件之间的值的交互影响。用元素值进行绑定时通过设置Binding的ElementName属性和Path属性来实现的,ElementName属性赋值为数据源控件的Name的值,Path 属性则赋值为数据源控件的某个属性,这个属性就是数据源控件的一个数据变化的反映。

在上一小节使用了“Binding Title”作为绑定扩展标志的语法,那么这个是最简单的绑定语法来的,其实我们可以利用Path属性实现更加丰富和灵活的绑定关联的语法,相关的语法情况如下所示:

(1)在最简单的情况下,Path属性值是要用于绑定的源对象的属性名,如 Path=PropertyName,那么{Binding Title}其实是{Binding Path=Title}的简写形式。

(2)在C#中可以通过类似语法指定属性的子属性。例如,子句 Path=ShoppingCart.Order 设置与对象或属性ShoppingCart的Order属性的绑定,也就是说ShoppingCart是你绑定数据源的属性,而Order则是ShoppingCart的属性,相当于是数据源的属性的属性。

(3)若要绑定到附加属性,应在附加属性周围放置圆括号。例如,若要绑定到附加属性Grid.Row,则语法是Path=(Grid.Row)。

(4)可以使用数组的索引器来实现数据的绑定。例如,子句 Path=ShoppingCart[0]将绑定设置为与数组属性的内部对应的索引的数值。

  (5)可以在Path子句中混合索引器和子属性,例如,Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

(6)在索引器内部,可以有多个由逗号分隔的索引器参数。可以使用圆括号指定每个参数的类型。例如, Path="[(sys:Int32)42,(sys:Int32)24]",其中sys映射到System命名空间。

(7)如果源为集合视图,则可以用斜杠“/”指定当前项。例如,子句 Path=/用于设置到视图中当前项的绑定。如果源为集合,则此语法指定默认集合视图的当前项。

(8)可以结合使用属性名和斜杠来遍历作为集合的属性。例如,Path=/Offices/ManagerName指定源集合的当前项,该源集合包含也作为集合的 Offices 属性。 其当前项是一个包含ManagerName属性的对象。

(9)也可以使用句点“.”路径绑定到当前源。例如,Text="{Binding}" 等效于 Text="{Binding Path=.}"。

下面给出控制圆的半径的示例:圆形的半径绑定到Slider控件的值,从而实现通过即时改变Slider控件的值来改变圆的大小。
    代码清单11-2:控制圆的半径(源代码:第11章\Examples_11_2)

MainPage.xaml文件主要代码
------------------------------------------------------------------------------------------------------------------
    <StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <TextBlock FontSize="25"  Name="textBlock1" Text="圆形的半径会根据slider控件的值而改变" />
        <Slider Name="slider" Value="50" Maximum="400"/>
        <TextBlock FontSize="25" Name="textBlock2" Text="半径为:"/>
        <TextBlock Name="txtblk" Text="{Binding ElementName=slider, Path=Value}" FontSize="48"/>
        <Ellipse  Height="{Binding ElementName=slider, Path=Value}"
                    Width="{Binding ElementName=slider, Path=Value}"
                    Fill="Red" Name="ellipse1" Stroke="Black" StrokeThickness="1"/>
    </StackPanel>

本文来源于《深入浅出Windows Phone 8.1 应用开发》

WP8.1 Runtime文章列表:http://www.cnblogs.com/linzheng/p/3998037.html

源代码下载:http://vdisk.weibo.com/s/zt_pyrfNHb99O

欢迎关注我的微博@WP林政   微信公众号:wp开发(号:wpkaifa)

WP8.1技术交流群:372552293

时间: 2025-01-09 05:06:41

[深入浅出WP8.1(Runtime)]数据绑定的基础的相关文章

[深入浅出WP8.1(Runtime)]网络编程之HttpClient类

12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类提供了一个简单的接口来处理最常见的任务,并为身份验证提供了适用于大多数方案的合理的默认设置.对于较为复杂的 HTTP 操作,更多的功能包括:执行常见操作(DELETE.GET.PUT 和 POST)的方法:获取.设置和删除 Cookie 的功能:支持常见的身份验证设置和模式:异步方法上提供的 HTT

[深入浅出WP8.1(Runtime)]应用实例——移动截图

10.2应用实例——移动截图 移动截图例子是实现一个把一张图片的某个部分截取出来的功能,并且用户可以选定截取的图片区间.那个该例子会使用ManipulationDelta事件来实现对截取区间的选择.然后使用UIElement元素的Clip属性对图片进行局部截取. 下面给出移动截图的示例:该示例主要有3个主要的逻辑分别是截图区域的选择.图片的局部截取和截图的展示. 代码清单10-3:移动截图(源代码:第10章\Examples_10_3) MainPage.xaml文件主要代码:在UI上image

[深入浅出WP8.1(Runtime)]Socket编程之UDP协议

13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只传送少量数据.对可靠性要求不高的应用环境.既然 UDP 是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可能会变得非常有用.因为UDP具有TCP所望尘莫及的速度优势.虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受

[深入浅出WP8.1(Runtime)]生成图片和存储生成的图片文件

7.2.3 使用RenderTargetBitmap类生成图片 RenderTargetBitmap类可以将可视化对象转换为位图,也就是说它可以将任意的UIElement以位图的形式呈现.那么我们在实际的编程中通常会利用RenderTargetBitmap类来对UI界面进行截图操作,比如把程序的界面或者某个控件的外观生成一张图片. 使用RenderTargetBitmap类生成图片一般有两种用途,一种是直接把生成的图片在当前的页面上进行展示,还有一种用途是把生成的图片当作文件存储起来,或者通过某

[深入浅出WP8.1(Runtime)]浮出控件(Flyout)

4.15 浮出控件(Flyout) 浮出控件(Flyout)是一个轻型的辅助型的弹出控件,通常会作为提示或者要求用户进行相关的交互来使用.Flyout控件与Windows Phone里面的弹出框MessageDialog是有很大区别的,首先Flyout控件是一个辅助控件,需要与其他控件结合起来才能使用,还有就是取消的规则不一样,Flyout控件可以通过单击或在外部点击都可以轻松消除浮出控件.你可以使用Flyout控件收集用户输入.显示与某个项目相关的更多信息或者要求用户确认某个操作.只有当为了响

[深入浅出WP8.1(Runtime)]应用文件的URI方案

6.2.4 应用文件的URI方案 在上文我们获取文件的方式都是通过应用程序的三个跟目录的文件夹对象来获取文件夹对象和文件对象,那么我们这一小节来讲解一种新的获取文件对象的方式,这种方式就是通过Uri地址来获取.应用程序存储里面的文件夹和文件其实和我们平时在Windows电脑上看到的文件的目录是一样的,只不过它们是在存储里面,你并不能很直观地看到他们的路径,当然我们还是可以通过StorageFile类的Path属性来查看到文件的保存路径,例如我们查看一个在LocalFolder文件夹的testfi

[深入浅出WP8.1(Runtime)]Windows Phone 8.1和Silverlight 8.1的区别

1.2.2 Windows Phone 8.1应用程序模型 Windows Phone 8.1支持多种开发语言来开发应用程序,包括C#.VB.JavaScript和C++,那么本书的代码主要是采用C#语言来开发,部分章节采用C++.从Windows  Phone 8.1开始,如果是开发普通的应用程序可以选择的应用程序模型有:C#/XAML.VB/XAML.C++/XAML和JavaScript /HTML5.游戏开发还是采用C++的DirectX的框架.在Windows Phone 8之前如果是

[深入浅出WP8.1(Runtime)]文本块(TextBlock)

4.3 文本块(TextBlock) 文本块(TextBlock)控件是用于显示少量文本的轻量控件,可以通过TextBlock呈现只读的文本,你可以把TextBlock控件理解为一种纯文本的展示控件.控件的XAML语法如下: <TextBlock .../> 或者 <TextBlock ...>内容</TextBlock> TextBlock在Windows Phone应用中非常普遍,它就相当于一个只是用于呈现文本的标签一样.写过HTML页面的开发者都知道,在HTML语

关于wp8.1 runtime模式下面的摄像头调用拍照问题和应用生命周期问题

现在的msdn文档,还找不到详细的wp8.1的摄像头拍照文档,只有一个序列拍照,类似九连拍的文档,而且这文档感觉就是windows8.1搬过来应付的,wp8.1模式,只要有一个地方处理不好,手机就会死机,只能拆电池重启了,做开发现在是想砸电脑的感觉,我昨天拆了接近三十次电池,你知道820手机的后壳多难拆么,不装后盖,很容易掉电池出来. wp8.1,调用摄像头的API改成用 mediacpature了,然后通过判断可以在初始化函数里面压入需要调用的摄像头数据,这个初始化,不知道是什么原因,在模拟器