数据绑定(Data Binding)是用户界面UI和业务对象或其它数据提供者(data provider)的连接。用户界面对象称为目标,数据提供者成为数据源。
  数据绑定帮助隔离应用程序的用户界面层和其他层,如业务对象、数据等等。通过绑定对象,实现用户界面层和底层的隔离。
  在Silverlight 2中,支持三种模式的数据绑定。

1.OneTime:一次绑定,在绑定创建时使用源数据更新目标,适用于只显示数据而不进行数据的更新。
2.OneWay:单向绑定,在绑定创建时或者源数据发生变化时更新到目标,适用于显示变化的数据。
3.TwoWay:双向绑定,在任何时候都可以同时更新源数据和目标。

本文只示例一次绑定中的常用问题,至于其它请参看另一篇文章"SilverLight学习笔记--Silverlight中INotifyPropertyChanged 接口在数据绑定中的使用 "
,在这篇文章里比较详细的示范了三类绑定模式的工作情况以及如何使用INotifyPropertyChanged接口实现绑定数据同步。
 下面开始我们的示例。
 新建一个Silverlight应用程序命名:SLDataBinding。
 在这个应用程序中,我们将实现以下示例

 1、如何在xaml文件中通过设置控件元素属性来实现绑定
 2、如何在后台代码中设置绑定属性
 3、如何绑定数据集数据源
 4、如何利用模板进行数据绑定。

在本例中,我们使用了ListBox来显示数据,对于ListBox的绑定有如下说明:
 如果ListBox中属性设置为 ItemsSource="{Binding Mode=OneWay}",则在此处设置DataContext 即:this.lstPeopleTemple.DataContext = PmyPeople.MyPeople,
 原因是ListBox 通过 ItemsSource 里的数据去填充数据项,所以直接给这个属性赋值是可以的 即:this.lstPeopleTemple.ItemsSource = PmyPeople.MyPeople;
或者, 通过空绑定语法 {Binding},指定 ItemsSource 属性绑定为数据源的对象本身(未指定绑定路径)。而数据源就是通过 DataContext 获得的,并且这个属性的数据可以从父对象继承下来。
 具体内容见代码部分.
 首先建立程序界面,代码如下:

Code
<UserControl x:Class="SLDataBinding.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="500">
 <StackPanel Width="400" Height="500" Background="Ivory">
        <TextBlock Text="绑定一个对象" TextAlignment="Center"  Foreground="Crimson" FontSize="16"></TextBlock>
        <TextBlock Text="界面设定绑定" TextAlignment="Center"  Foreground="Green" FontSize="12"></TextBlock>
        <StackPanel Width="400" Height="60" Background="AliceBlue" Orientation="Vertical"  HorizontalAlignment="Center">
            <TextBlock x:Name="tbMyNameFrnt" Text="{Binding Name}" Width="200" Margin="3" TextAlignment="Center" ></TextBlock>
            <Button x:Name="btnBindOneObjFrnt" Content="界面设定绑定一个对象" Height="25" Width="200" Margin="6" Click="btnBindOneObjFrnt_Click"></Button>
        </StackPanel>
        <TextBlock Text="后台代码设定绑定" TextAlignment="Center"  Foreground="Green" FontSize="12"></TextBlock>
        <StackPanel Width="400" Height="60" Background="AliceBlue" Orientation="Vertical"  HorizontalAlignment="Center">            
           <TextBlock x:Name="tbMyNameBehind" Text="当前尚无数据 ." Width="200" Margin="3" TextAlignment="Center" ></TextBlock>
           <Button x:Name="btnBindOneObjBehind" Content="后台代码设定绑定" Height="25" Width="200" Margin="6"  Click="btnBindOneObjBehind_Click" ></Button> 
        </StackPanel>     
     <TextBlock Text="绑定对象集合" TextAlignment="Center"  Foreground="Crimson" FontSize="16"></TextBlock>
        <ListBox x:Name="lstPeople" Margin="5" ItemsSource="{Binding Mode=OneWay}" Width="300" Height="80">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name}" Margin="2" Width="100" Height="12" Foreground="Blue"  ></TextBlock>
                        <TextBlock Text="{Binding Age}" Margin="6" Width="100" Height="12" Foreground="Green" ></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>            
        </ListBox>
        <Button x:Name="btnBindCollectObjFrnt" Content="直接绑定一个对象集合" Height="25" Width="200" Margin="6" Click="btnBindCollectObjFrnt_Click"></Button>
        <ListBox x:Name="lstPeopleTemple" Margin="5" Width="300" Height="80"                    
                  ItemTemplate="{StaticResource MyListBoxDataTemplate}">
        </ListBox>
        <Button x:Name="btnBindCollectObjFrntTemple" Content="使用List的DataTemplate完成绑定 " Height="30" Width="200" Margin="6"  Click="btnBindCollectObjFrntTemple_Click"></Button>
    </StackPanel>
</UserControl>

界面如下图

 
其次,我们需要建立绑定所需的数据源,在此,我们新建两个类,一个名为Person,一个名为People,
Person类定义如下:

Code
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SLDataBinding
{
    public class Person
    {
        private string _name;
        private int  _age;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

public Person()
        {
        
        }

public Person(string nameStr, int ageInt)
        {
            this.Name = nameStr;
            this.Age = ageInt;
        }

}
}

People类定义如下:

Code
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.ObjectModel; //因为要使用

namespace SLDataBinding
{
    public class People
    {
       // 利用 ObservableCollection 类, Silverlight 应用程序可以使绑定控件与基础数据源保持同步,但它还提供了更有用的信息,
        //尤其是 ObservableCollection 类还可以在您添加、删除、移动、刷新或替换集合中的项目时引发 CollectionChanged 事件。
        //此功能还可以在您的窗口以外的代码修改基础数据时做出反应。

private ObservableCollection<Person> _myPeople;
        public ObservableCollection<Person>  MyPeople
        {
            get { return _myPeople; }
            set { _myPeople = value; }
        }

public People()
        {
            this.MyPeople=new ObservableCollection <Person>();
            MyPeople.Add(new Person("Jack",12));
            MyPeople.Add(new Person("Tom", 16));
            MyPeople.Add(new Person("Simon", 20));
            MyPeople.Add(new Person("Emenue", 19));
            MyPeople.Add(new Person("Colodia", 22));
            MyPeople.Add(new Person("Frank", 28));

}
    }
}

Page.xaml.cs全部代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using System.Windows.Data; //因为要使用Binding类,所以需要引入此空间

namespace SLDataBinding
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
        }
        
        如何在xaml文件中通过设置控件元素属性来实现绑定#region  如何在xaml文件中通过设置控件元素属性来实现绑定
        private void btnBindOneObjFrnt_Click(object sender, RoutedEventArgs e)
        {
            Person pJack = new Person("Jack", 12);
            this.tbMyNameFrnt.DataContext = pJack;
        }
        #endregion

        如何在后台代码中设置绑定属性#region 如何在后台代码中设置绑定属性
        private void btnBindOneObjBehind_Click(object sender, RoutedEventArgs e)
        {
            Person pJack = new Person("Jack", 12);

            //创建绑定对象
            Binding MyBinding = new Binding();

            //对绑定对象设置属性
            MyBinding.Path = new PropertyPath("Name");
            MyBinding.Mode = BindingMode.OneTime;


            一、根据绑定对象的Source属性设置绑定源#region 一、根据绑定对象的Source属性设置绑定源
            // MyBinding.Source = pJack;
            #endregion

            二、根据数据上下文做数据绑定#region 二、根据数据上下文做数据绑定
            this.tbMyNameBehind.DataContext = pJack;
            #endregion

            this.tbMyNameBehind.SetBinding(TextBlock.TextProperty, MyBinding);
        }
        #endregion

        如何绑定数据集数据源#region 如何绑定数据集数据源
        private void btnBindCollectObjFrnt_Click(object sender, RoutedEventArgs e)
        {
            People PmyPeople = new People();
            this.lstPeople.DataContext = PmyPeople.MyPeople;
        }
        #endregion

        如何利用模板进行数据绑定。#region 如何利用模板进行数据绑定。
        private void btnBindCollectObjFrntTemple_Click(object sender, RoutedEventArgs e)
        {
            //如果ListBox中属性设置为 ItemsSource="{Binding Mode=OneWay}",则在此处设置DataContext 即:this.lstPeopleTemple.DataContext = PmyPeople.MyPeople;
            //原因是ListBox 通过 ItemsSource 里的数据去填充数据项,所以直接给这个属性赋值是可以的 即:this.lstPeopleTemple.ItemsSource = PmyPeople.MyPeople;
            //或者,通过空绑定语法 {Binding},指定 ItemsSource 属性绑定为数据源的对象本身(未指定绑定路径)。
            //而数据源就是通过 DataContext 获得的,并且这个属性的数据可以从父对象继承下来。

            People PmyPeople = new People();
            this.lstPeopleTemple.ItemsSource = PmyPeople.MyPeople;

        }
        #endregion
    }
}

程序运行效果如下:
                              

前往:Silverlight学习笔记清单

本文程序在Silverlight2.0和VS2008环境中调试通过。本文参照了部分网络资料,希望能够抛砖引玉,大家共同学习。
(转载本文请注明出处)

SilverLight学习笔记--Silverlight之数据绑定初探相关推荐

  1. SilverLight学习笔记--Silverlight中WebRequest通讯

    本文我们学习如何使用WebRequest类实现客户端和服务器端的通讯.      本例处理过程:在客户端,我们在文本框中输入任意文本,然后用POST方法向服务器端传递信息,服务器端收到从客户端传来的信 ...

  2. SilverLight学习笔记--Silverlight中WebService通讯

    本文我们学习如何在Silverlight中使用WebService进行通讯. 新建项目Silverlight应用程序,命名为:SLWebService. 在服务器端我们需要做两项目工作: 1.在Web ...

  3. SilverLight学习笔记--Silverlight中操作DOM元素

    在这里我们将实验一下在Silverlight中如何操作HTML的DOM元素. 首先创建Silverlight应用程序.   创建用户界面: <UserControl x:Class=" ...

  4. vs2010 学习Silverlight学习笔记(11):数据与通信之WebClient

    概要: 基础知识终于学完了,我今天又从第一篇看到第十篇,发现明白了一些东西,还有忘记了部分东西.呵呵,咱不能猴子掰玉米,学了新的忘记旧的.要经常去复习,去用.这一篇是数据通信部分的第一篇,有些东西没接 ...

  5. SilverLight学习笔记--如何在xaml文件中操作用户在后台代码定义的类(2)--示例篇:创建一个登录控件(原创)(转载本文请注明出处)...

    本文将示例如何运用前篇所写知识来建立一个用户自定义的登录控件.此控件界面非常简单,主要涉及的知识点是:   如何创建用户控件(包括对此控件的自定义事件和属性的编写,此处我们将创建一个名为LoginBo ...

  6. vs2010 学习Silverlight学习笔记(7):控件样式与模板

    概要: 终于知道Silverlight--App.xaml是干什么用的了,不仅可以用来封装样式(类似css),还可以制定控件模版...好强大的功能啊. 封装: 继续学习<一步一步学Silverl ...

  7. SilverLight学习笔记--建立Silverlight自定义控件(5)--绑定动画效果

    有了上述的基础,我们进一步完善我们的自定义控件,在此我们将创建Storyboard和前面的添加事件处理方法为我们的自定义控件加上动画效果.   1.首先,在MyDesignButton项目中进一步完善 ...

  8. SilverLight学习笔记--建立Silverlight自定义控件(1)--外观设计

    Silverlight 2 以丰富且强大可靠的控件模型闻名,该模型是平台中包括的控件和第三方控件包的基础.您也可以使用此控件模型构建自己的控件.   在了解如何为新平台编写自定义控件时,我经常先复制一 ...

  9. SilverLight学习笔记--如何解决Button不响应MouseLeftButtonDown与MouseLeftButtonUp事件的问题...

    在Silverlight 2 中的按钮不能响应MouseLeftButtonDown 和 MouseLeftButtonUp 事件,为解决此问题,我们可通过创建自定义按钮控件加以解决, 1.创建自定义 ...

最新文章

  1. Android内容观察者
  2. tableau可视化数据分析60讲(七)-工作表操作(长篇干货建议收藏!)
  3. 积分商城如何梳理思路和进行设计
  4. poj3311 经典tsp问题
  5. 计算机学业水平考试答题卡,高一年级期末信息技术考试(含答题卡)
  6. php时间跨度,在PHP中执行与日期时间相关的操作
  7. OpenShift 4 - 集群节点日志和API审计日志策略
  8. python数据模糊匹配,使用python中两个数据集的模糊匹配创建标志
  9. 小红书支付老显示服务器开小差,常见问题
  10. wpsoffice 安装包_WPS office (安卓、ios) 企业版 软件介绍(附安装包)
  11. 废旧手机变身服务器,打造私人云盘
  12. 武汉坚守第六十一天——运动健康相关联,牛尿神奇为哪般
  13. linux svn图形工具,linux 下svn图形客户端smartsvn 安装
  14. NAC(网络准入控制)实施案例(20100531)
  15. java实现苹果和虫子2
  16. Java代码是如何运行的?
  17. Java 图像处理框架-Marvin
  18. 【Python】大数据挖掘课程作业3——使用朴素贝叶斯分类对B站评论进行分析
  19. 羡慕华为人年薪110万?先看看华为员工的16项标准!
  20. AI开发者被疯抢,华为做了什么?

热门文章

  1. ZooKeeper的配置文件优化性能(转)
  2. 技巧:Vim 的纵向编辑模式
  3. HDU 1233 还是畅通工程。
  4. 用ORBSLAM2运行TUM Dataset数据集Monocular Examples
  5. js 拖动层示例[转]
  6. 给出一种符号表的组织方式和结构设计,要考虑数组类型和函数(不得与课件上的雷同)
  7. hadoop使用mapreduce统计词频_深圳嘉华学校之Hadoop简介(什么是Map-Reduce-Mapreduce-about云开发)...
  8. animate用法 js原生_用 原生Javascript 创建带动画的固顶导航菜单
  9. 同一张表两方各字段相同_SQL高级知识——派生表
  10. php如何获取当前时间 格式化,PHP获取当前日期和时间格式化步骤