`

Silverlight3系列(四)数据绑定 Data Binding 1

阅读更多

  今天我们讨论的是Silverlight3中的数据绑定,内容来自 《Pro Silverlight3 in C#》的读后感,中文名称可以译为《Silverlight3高级编程 C#版》。我找到的是一本PDF的,在网上可以搜索到下载地址。

  数据绑定提供了一种,从对象中获取信息,然后显示在你的应用程序的界面上,同时不需要写冗长的代码就可以完成所有的工作的方式。通常情况下,富客户端提供两种绑定方式,不仅可以从兑现获取数据,显示到界面上,也可以将界面的数据传回给对象。

  Silverlight是不允许客户端直接使用ADO.NET直接连接数据库,进行数据库操作的。只能通过代理的方式操作数据库,通过第三方,例如:webservice、wcf、ado.net data service、ric service等服务性的方式。

  1、绑定到数据对象

  例如现在又一个Customer的实体对象

  

数据对象
<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> --> [DataContract]
    
public class Customer
    {
        
private int _intCustomerId;
        
private string _strCustomerName;
        
private string _strCustomerCode;
        [DataMember]
        
public virtual  int CustomerId
        {
            
get { return this._intCustomerId; }
            
set { this._intCustomerId = value; }
        }
        [DataMember]
        
public virtual string CustomerName
        {
            
get { return this._strCustomerName; }
            
set { this._strCustomerName = value; }
        }
        [DataMember]
        
public virtual string CustomerCode
        {
            
get { return _strCustomerCode; }
            
set { this._strCustomerCode = value; }
        }
    }
  

 

  想要达到下图的一种效果

 
  就需要下面这样的代码,在页面中可以用 Text="{Binding CustomerId}"来实现。
  
前台页面
<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> --><Grid x:Name="LayoutRoot" Background="White">
            
<Grid.ColumnDefinitions>
                
<ColumnDefinition/>
                
<ColumnDefinition/>
            
</Grid.ColumnDefinitions>
            
<Grid.RowDefinitions>
                
<RowDefinition Height="20"/>
                
<RowDefinition Height="20"/>
                
<RowDefinition Height="20"/>
                
<RowDefinition Height="20"/>
                
<RowDefinition Height="20"/>
                
<RowDefinition Height="20"/>

            
</Grid.RowDefinitions>
            
<TextBlock x:Name="LblCustomerId" Grid.Column="0" Grid.Row="0" Text="Customer Id"/>
            
<TextBlock x:Name="TxtCustomerId" Grid.Column="1" Grid.Row="0" Text="{Binding CustomerId}"/>
            
<TextBlock x:Name="LblCustomerCode" Grid.Column="0" Grid.Row="1" Text="Customer Code"/>
            
<TextBlock x:Name="TxtCustomerCode" Grid.Column="1" Grid.Row="1" Text="{Binding CustomerCode}"/>
            
<TextBlock x:Name="LblCustomerName" Grid.Column="0" Grid.Row="2" Text="用户名称"/>
            
<TextBlock x:Name="TxtCustomerName" Grid.Column="1" Grid.Row="2" Text="{Binding CustomerName}"/>


        
</Grid>
  

  后台代码

  

 

绑定到对象
<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> --> void client_GetCustomerCompleted(object sender, GetCustomerCompletedEventArgs e)
        {
            Customer customer 
= new Customer() { CustomerId = 1, CustomerCode = "ss", CustomerName = "dddd" };
            LayoutRoot.DataContext 
= customer;
        }

 

  2、将数据对象存储为资源

  提供一篇文章,供大家参考:http://www.c-sharpcorner.com/UploadFile/dpatra/StaticResourceInSilverlight308162009132358PM/StaticResourceInSilverlight3.aspx

  首先要在类代码中存在一个资源对象,

  

 

代码
<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> -->namespace Silverlight
{
    
public class Users
    {
        
public string Firstname { getset; }
        
public string Lastname { getset; }
    }
    
public partial class DataBindingDemo : UserControl
    {
        
public DataBindingDemo()
        {
           InitializeComponent();
      
        }
    }
}

 

  

  

在控件中存储资源
<!--<br/ /> <br/ /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ /> http://www.CodeHighlighter.com/<br/ /> <br/ /> --><UserControl x:Class="Silverlight.DataBindingDemo"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" 
             
 xmlns:local="clr-namespace:Silverlight"
    Width="400" Height="300">
    
<UserControl.Resources>
     
        
<local:Users x:Key="SingleUser" Firstname="virus" Lastname="ssss"></local:Users>
    
</UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        
<TextBox Text="{Binding Path=Firstname,Source={StaticResource SingleUser}}"></TextBox>
    
</Grid>
    
</UserControl>

 

  

 

  上面的红色部分的xmlns:local="clr-namespace:Silverlight"是定义资源的命名空间,

  <UserControl.Resources>
     
        
<local:Users x:Key="SingleUser" Firstname="virus" Lastname="ssss"></local:Users>
    
</UserControl.Resources> 

  是定义一个资源

  <TextBox Text="{Binding Path=Firstname,Source={StaticResource SingleUser}}"></TextBox>
  是绑定到控件,源是SingleUser,绑定的具体属性是Firstname。如果是绑定一个属性的话,每次都需要设置Source的值,如果是绑定到一个Grid上面的话,可以使用<Grid Name="gridUsers" DataContext="{StaticResource SingleUser}">来绑定。

  3、可编辑的双向绑定

  到这里你可能想要知道,如果我在界面上修改一个值,会发生什么呢?例如你修改了界面上面的文本框的值,文本框的值绑定了一个对象的属性,在内存中的对象属性会改变吗?

  实际上,内存中的对象属性没有任何变化,因为Silverlight默认使用单向绑定。

  System.Windows.Data.BindingMode枚举量中定义了全部的绑定类型,如下表:

  

Name

Description

OneWay

单向绑定

当对象属性改变的时候,绑定对象就会改变

TwoWay

双向绑定

当源对象属性改变的时候,绑定对象会改变;反过来,绑定对象的改变也会影响源对象属性的改变。

OneTime

一次性绑定

绑定对象在第一次初始化的时候显示对象的属性,后面不会随着对象属性的改变而改变,这种适用于你确定对象的属性几乎不会改变的情况下。

 

  <TextBox Text="{Binding Firstname, Mode=TwoWay}"></TextBox>

  如果你使用了双向绑定,如果你修改了textbox的值,当你的鼠标焦点一离开textbox之后(焦点在两外一个控件,或者点击一个按钮),内存中的对象属性Firstname就会发生改变,执行属性的set。

      使用了双向绑定之后,焦点一离开控件之后就会触发内存对象的改变,但是有的时候我们想精确控制,而不是等焦点移除的时候,例如:输入框在用户输入的同时就进行,而不是等用户焦点移出输入框,你可以在代码中调用 BindingExpression.UpdateSource();

     

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->private void txtFirstname_TextChanged(object sender, TextChangedEventArgs e)
        {
            BindingExpression expression 
= txtFirstname.GetBindingExpression(TextBox.TextProperty);
            expression.UpdateSource();
        }

 

      使用上面的代码,你就可以在用户进入文本框和输入的时候就强迫文本框更新源对象的属性值。如果你全部的控件都是用这样的更新方式,你就可以禁用Silverlight的自动更新功能,设置UpdateSourceTrigger属性的值为Explicit。

     

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><TextBox x:Name="txtFirstname" 
                 Text
="{Binding Path=Firstname,Source={StaticResource SingleUser}, Mode=TwoWay, UpdateSourceTrigger=Explicit}"
                 TextChanged
="txtFirstname_TextChanged"></TextBox>

 

 

      在Silverlight中UpdateSourceTrigger有两个属性值可以设置:Default和Explicit。

      4、数据验证 Validation

      数据验证将在下一篇中重点讲解。先提供一个实例代码下载:DataValidation

      验证的话,就需要Silverlight客户端和wcf服务端共享类库,共享实体类,因为服务端的实体类虽然被序列化到客户端,但是只能序列化状态信息,就是成员,方法之类的不会序列化的,而且就算序列化过来,也没有什么用,运行环境context都不一样了,没有什么意思。所以可能会用到客户端和服务端共享类库,可以参考下面的文章。

     

    Silverlight客户端和WCF服务器端共享类库

 

      5、绑定到一个数据服务

      更复杂的数据绑定中,数据可能是从外部服务获取的。这里的外部服务使用wcf来提供,下面的代码假定你已经了解wcf,如果不了解的可以看老徐的博客或者google一些资料来看。数据库操作部分使用NHibernate 2.1.2完成。

      首先定义数据交互契约

     

实体代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ComponentModel;
using System.Runtime.Serialization;

namespace Domain.Server
{
    [DataContract]
    public class Customer : INotifyPropertyChanged
    {
        private int _intCustomerId;
        private string _strCustomerName;
        private string _strCustomerCode;
        [DataMember]
        public virtual int CustomerId
        {
            get { return this._intCustomerId; }
            set
            {
                this._intCustomerId = value;
                OnPropertyChanged("CustomerId");
            }
        }
        [DataMember]
        public virtual string CustomerName
        {
            get { return this._strCustomerName; }
            set
            {
                this._strCustomerName = value; OnPropertyChanged("CustomerName");
            }
        }
        [DataMember]
        public virtual string CustomerCode
        {
            get { return _strCustomerCode; }
            set
            {
                this._strCustomerCode = value;
                OnPropertyChanged("CustomerCode");
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

 

      wcf服务代码

     

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using Domain.Server;
using Common.Core;
using Common.Data;
namespace WcfService
{
    public class ServiceCustomer : IServiceCustomer
    {
        private CustomerDAO _customerDao;
        Common.Core.Utility.NHibernateUtility _NHUtility;
        MyValidator _myValidator;
        public ServiceCustomer()
        {
            _NHUtility = new Common.Core.Utility.NHibernateUtility();
            _customerDao = new CustomerDAO(_NHUtility.GetSession());
           
            //string name = OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;
        }
        // Add more operations here and mark them with [OperationContract]

        public Domain.Server.Customer GetCustomer(int customerId)
        {
           
            Domain.Server.Customer objCustomer = new Domain.Server.Customer();

            return _customerDao.GetCustomerById(customerId);
        }


    }
}

 

 

      Silverlight的前台代码

     

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><Grid x:Name="LayoutRoot" Background="White">
            
<Grid.ColumnDefinitions>
                
<ColumnDefinition/>
                
<ColumnDefinition/>
            
</Grid.ColumnDefinitions>
            
<Grid.RowDefinitions>
                
<RowDefinition Height="20"/>
                
<RowDefinition Height="20"/>
                
<RowDefinition Height="20"/>
                
<RowDefinition Height="20"/>
                
<RowDefinition Height="20"/>
                
<RowDefinition Height="20"/>

            
</Grid.RowDefinitions>
            
<TextBlock x:Name="LblCustomerId" Grid.Column="0" Grid.Row="0" Text="Customer Id"/>
            
<TextBlock x:Name="TxtCustomerId" Grid.Column="1" Grid.Row="0" Text="{Binding CustomerId}"/>
            
<TextBlock x:Name="LblCustomerCode" Grid.Column="0" Grid.Row="1" Text="Customer Code"/>
            
<TextBlock x:Name="TxtCustomerCode" Grid.Column="1" Grid.Row="1" Text="{Binding CustomerCode}"/>
            
<TextBlock x:Name="LblCustomerName" Grid.Column="0" Grid.Row="2" Text="用户名称"/>
            
<TextBlock x:Name="TxtCustomerName" Grid.Column="1" Grid.Row="2" Text="{Binding CustomerName}"/>


        
</Grid>

 

 

      Silverlight的后台代码

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->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 Silverlight.ServiceCustomer;

namespace Silverlight
{
    public partial class sldbdemo : UserControl
    {
        ServiceCustomerClient client;
        SysUser _sysUser;
        public sldbdemo()
        {
            InitializeComponent();
            client = new ServiceCustomerClient();
            GetCustomerById(1);
        }
        protected void GetCustomerById(int customerId)
        {
            try
            {
                client.GetCustomerCompleted += new EventHandler
<GetCustomerCompletedEventArgs>(client_GetCustomerCompleted);
                client.GetCustomerAsync( customerId);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + ex.InnerException.Message);
            }
        }

        void client_GetCustomerCompleted(object sender, GetCustomerCompletedEventArgs e)
        {
             LayoutRoot.DataContext = e.Result;
        }
    }
}

 

      代码无误,就应该看到下面的内容,前提是数据库有Id=1的用户信息。数据操作部分也可以自己写DbConnection来做,效果是一样的。

 

 

      6、绑定一个数据集合

      下文继续。

   代码可以在http://silverlightwcf.codeplex.com/下载。

分享到:
评论

相关推荐

    Silverlight绑定数据的例子.zip

    在这个"Silverlight绑定数据的例子.zip"压缩包中,我们很可能会找到一个演示如何在Silverlight应用中实现数据绑定的实例。 在Silverlight中,数据绑定主要通过XAML(Extensible Application Markup Language)来...

    (15)silverlight数据源对象的访问

    Silverlight中的`Binding`类是实现数据绑定的主要工具,可以通过设置`Source`属性指定数据源,`Path`属性指定要绑定的属性路径。此外,还可以设置`Mode`属性来控制数据流向,例如单向或双向绑定。 为了简化数据绑定...

    Silverlight 3 完整示例(包含各种交互,注释完整)

    7. **数据绑定和MVVM模式**:Silverlight 3支持数据绑定,简化了UI和业务逻辑之间的交互。Model-View-ViewModel(MVVM)设计模式在其中得到了广泛应用,通过`INotifyPropertyChanged`接口和`Binding`类,实现了视图...

    Silverlight MVVM 窗体数据传递

    View与ViewModel通过数据绑定(Data Binding)紧密相连,View中的控件可以直接反映出ViewModel中的属性变化。 3. **ViewModel**:视图模型层,是View和Model之间的桥梁。ViewModel封装了业务逻辑,提供与View交互的...

    silverlight

    Data Binding是Silverlight中常用的功能,用于连接视图和模型。 5. **事件处理**:学习如何为控件添加事件监听器,以便在用户与界面交互时执行特定的操作。这是实现用户交互性的核心。 6. **动画和效果**:...

    silverlight 自定义表格

    在Silverlight中,可以利用Data Binding将UI元素与数据源进行关联,这样就能动态地更新和显示数据。这对于构建表格控件至关重要,因为它允许我们在后台数据发生变化时自动更新表格内容。 在自定义表格控件的过程中...

    Silverlight与数据库交互示例

    它不仅能够提供与Flash相媲美的动画和图形效果,还支持更高级别的数据绑定、XAML(可扩展应用程序标记语言)以及.NET Framework的强大功能。本文将详细介绍如何使用Silverlight结合.NET 3.5技术创建一个数据驱动的...

    基于XML + LINQ 实现的Dynamic Silverlight 控件源码例子

    在Silverlight中,数据绑定(Data Binding)是将UI控件与数据源连接的关键机制。在本例的"BindingXML"中,开发者可能使用了`{Binding}`标记来指示控件的属性应绑定到XML数据的哪个部分。这样,当XML数据发生变化时,...

    基于silverlight的access数据库读写

    数据绑定是Silverlight中一种强大的机制,它允许UI元素与后台数据源动态关联。在XAML中,你可以定义UserControl或Page,使用DataGrid、ListBox等控件展示数据,通过Binding属性将它们与数据源关联。 为了读取Access...

    Silverlight分页源码

    7. **数据绑定(Data Binding)**:Silverlight支持双向数据绑定,使UI元素和视图模型之间的数据自动同步,简化了编程工作。 在实现分页时,需要注意性能优化,比如使用虚拟化技术,只渲染当前可见的数据行,减少...

    Silverlight中给DataGrid赋值

    3. **设置ItemsSource**:最后,将数据源绑定到DataGrid的ItemsSource属性上,这样DataGrid就会根据数据源自动填充内容。 ```csharp dataGrid.ItemsSource = dataList; ``` 或在XAML中直接设置: ```xml ...

    Silverlight示例6

    7. **数据绑定(Data Binding)** 如果图像数据来源于应用程序的数据模型,可以使用 Silverlight 的数据绑定功能将 Image 控件的 Source 属性绑定到模型中的图像源属性,实现动态加载和更新。 8. **样式和模板...

    silverlight4.0 Treeview 从 wcf 动态获取数据

    在本文中,我们将深入探讨...这涉及到安装必要的开发工具,创建和实现WCF服务,以及在Silverlight客户端进行数据绑定和调用服务。这个过程对于构建具有动态数据加载功能的树形视图是非常实用的,适用于多种业务场景。

    silverlight 2.0 下的 XPS文件查看器源码

    1. **Data Binding**:Silverlight中的数据绑定机制用于将UI元素与数据模型连接起来,使得文档的更新能实时反映在界面上。 2. **Layout and Rendering**: Silverlight提供了强大的布局系统,如Grid、Canvas等,...

    使用Silverlight Toolkit绘制图表饼图,折线图,散点图

    每个数据点对应图表中的一块,通过设置DataPoint的Binding属性,将数据绑定到相应的值。还可以自定义颜色、标签和百分比显示等,以增强视觉效果。 2. **折线图(Line Chart)**:折线图适用于展示数据随时间变化的...

    silverlight访问oracle数据库实例

    Silverlight支持数据绑定,可以将从WCF服务获取的数据直接绑定到UI元素上,实现数据的实时更新。这可以通过DataContext属性和数据模板实现。 8. **错误处理和调试** 在服务端和客户端都要设置适当的异常处理,...

    silverlight传值demo

    2. **数据绑定(Data Binding)**:数据绑定允许UI元素与应用程序中的数据源自动同步。在Silverlight 2.0中,你可以使用`Binding`类来实现双向或单向绑定,确保UI的更新反映到数据模型,反之亦然。 3. **事件...

    Silverlight 5帮助文档

    Silverlight 5的Data Binding功能得到了加强,支持双向绑定和延迟绑定,简化了数据驱动的应用程序开发。 4. **深度集成的调试工具** 针对开发者的便利,Silverlight 5提供了内建的调试工具,可以进行XAML和...

    Silverlight探秘系列课程(5):应用图片

    同时,通过结合Data Binding,我们可以实现图片源与数据模型之间的动态绑定,提高程序的灵活性。 此外,Silverlight也支持图片的裁剪和缩放。可以利用WriteableBitmap类将图片转换为可写像素数组,进而进行像素级别...

    (20)Silverlight 2.0中托管代码与前端交互

    2. **数据绑定(Data Binding)**:数据绑定是另一种强大的交互方式,它允许UI元素的值自动与后端的数据源同步。在Silverlight 2.0中,可以通过`Binding`对象定义数据绑定关系,使得UI元素的值随着模型数据的改变而...

Global site tag (gtag.js) - Google Analytics