`

Silverlight3系列(五)数据绑定 Data Binding 2

阅读更多

      接着上面一篇,我们来讨论绑定集合等。

  

  首先看一下可以进行绑定集合的控件属性,暂时我就不翻译了,因为翻译不好,还不如读英文呢。

 

Name

Description

ItemsSource

 Points to the collection that has all the objects that will be shown in the list.

DisplayMemberPath

 Identifies the property that will be used to creat the display text for each item.

ItemTemplate

 Providers a data template that will be used to create the visual appearance of each item.This property acts as a far more powerful replacement for DisplayMemberPath.

ItemsPanel

 Providers a template that will be used to create the layout container that holds all the items in the list.

  这里你可能会想,什么类型的集合可以绑定到ItemsSource属性呢?告诉你,只需要实现IEnumerable就可以,但是,实现这个借口的集合是只读的。如果你想编辑这个集合,例如允许插入和删除,你需要更多的工作,后面我们会介绍。

 

  显示并且编辑集合项

  首先定义个数据库交互契约

   

代码
<!--<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.Entity
{
    [DataContract]
    public class Customer : INotifyPropertyChanged
    {
        private int _intCustomerId;
        private string _strCustomerName;
        private string _strCustomerCode;
        private CustomerType  _CustomerType;
        private int _intCustomerTypeId;

        [DataMember ]
        public virtual  int CustomerTypeId
        {
            get { return _intCustomerTypeId; }
            set { _intCustomerTypeId = value; }
        }

        [DataMember ]
        public virtual  CustomerType  CustomerType
        {
            get { return this._CustomerType; }
            set
            {

                this._CustomerType = value;
                OnPropertyChanged("CustomerType");
            }
        }

        [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.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using Domain.Entity;

namespace WcfService
{
    [ServiceContract]
    public interface IServiceCustomer
    {
        [OperationContract]
        Domain.Entity.Customer GetCustomer(int customerId);
        [OperationContract]
        IList
<Domain.Entity.Customer> GetAll();
        [OperationContract]
        void Add(Domain.Entity.Customer customer);
        [OperationContract]
        string SayHello(SysUser sysUser);
    }
   
}

 

  实现这个接口

  

代码
<!--<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.Entity;
using Common.Core;
using Common.Data;
namespace WcfService
{
    [AspNetCompatibilityRequirements(RequirementsMode 
= AspNetCompatibilityRequirementsMode.Allowed)]
    
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());
        }
        
// Add more operations here and mark them with [OperationContract]

        
#region IServiceCustomer Members
        
public Domain.Entity.Customer GetCustomer( int customerId)
        {

            Domain.Entity.Customer objCustomer 
= new Domain.Entity.Customer();

            
return _customerDao.GetCustomerById(customerId);
        }

        
#endregion

        
#region IServiceCustomer Members


        
public IList<Domain.Entity.Customer> GetAll()
        {

            IList
<Domain.Entity.Customer> cs = _customerDao.GetAll();
            
return cs;
        }

        
#endregion

        
#region IServiceCustomer Members


        
public void Add(Domain.Entity.Customer customer)
        {
            _customerDao.CreateCustomer(customer);

        }

        
#endregion

        
#region IServiceCustomer Members


        
public string SayHello(SysUser sysUser)
        {
            _myValidator 
= (MyValidator)OperationContext.Current.Host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator;

            
return string.Format("hello,{0},your password is {1}\n{2}{3}", sysUser.UserName, sysUser.Password,
               
// _myValidator.ToString(),_myValidator.ToString() );
                _myValidator.UserName ,_myValidator.Password );
        }

        
#endregion
    }
}

 

  Silverlight客户端前台代码

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><UserControl xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:data
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="Silverlight.sldbdemo" 
    Width
="400">

    
<ScrollViewer>
        
<StackPanel>
            
<Button x:Name="btnGetCustomer" Content="获取一个用户信息" Click="btnGetCustomer_Click"></Button>
            
<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>
            
<Button x:Name="btnGetAllCustomer" Content="获取全部用户信息" Click="btnGetAllCustomer_Click"></Button>
            
<Grid x:Name="customers" Background="Gray" Grid.ColumnSpan="2" Grid.Column="0" Grid.Row="3">

                
<data:DataGrid x:Name="dataGrid" CanUserResizeColumns="true" CanUserSortColumns="True"
                           AutoGenerateColumns
="False" ItemsSource="{Binding}">
                    
<data:DataGrid.Columns>
                        
<data:DataGridTextColumn Header="Id" Binding="{Binding CustomerId}"></data:DataGridTextColumn>
                        
<data:DataGridTextColumn Header="Code" Binding="{Binding CustomerCode}"></data:DataGridTextColumn>
                        
<data:DataGridTextColumn Header="Name" Binding="{Binding CustomerName}"></data:DataGridTextColumn>
                    
</data:DataGrid.Columns>

                
</data:DataGrid>

            
</Grid>
            
<StackPanel Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="4">
                
<data:DataPager x:Name="tempPager" DisplayMode="FirstLastPreviousNextNumeric" HorizontalAlignment="Left" VerticalAlignment="Top"
                Source
="{Binding Path=ItemsSource,ElementName=dataGrid}"
               PageSize
="5"
                            
></data:DataPager>
            
</StackPanel>
            
<Grid x:Name="AddCustomer" Background="White" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="5" Height="97">
                
<Grid.ColumnDefinitions >
                    
<ColumnDefinition Width="0.5*"></ColumnDefinition>
                    
<ColumnDefinition Width="0.5*"></ColumnDefinition>
                
</Grid.ColumnDefinitions>
                
<Grid.RowDefinitions >
                    
<RowDefinition Height="0.247*" ></RowDefinition>
                    
<RowDefinition Height="0.247*" ></RowDefinition>
                    
<RowDefinition Height="0.247*" ></RowDefinition>
                    
<RowDefinition Height="0.258*" ></RowDefinition>
                
</Grid.RowDefinitions>
                
<TextBlock Text="Customer Id" Grid.Column="0" Grid.Row="0"></TextBlock>
                
<TextBox x:Name="customerId" Grid.Column="1" Grid.Row="0"></TextBox>
                
<TextBlock Text="Custoemr Code" Grid.Column="0" Grid.Row="1"></TextBlock>
                
<TextBox x:Name="customerCode" Grid.Column="1" Grid.Row="1"></TextBox>
                
<TextBlock Text="Customer Name" Grid.Column="0" Grid.Row="2"></TextBlock>
                
<TextBox x:Name="customerName" Grid.Column="1" Grid.Row="2"></TextBox>
                
<Button x:Name="btnOk" Grid.Column="0" Grid.Row="3" Height="25" Content="添加用户Add Customer" Click="btnOk_Click"></Button>
            
</Grid>
            
<Button x:Name="btnLoadData" Click="btnLoadData_Click" Content="加载数据"></Button>
            
<ListBox x:Name="lstCustomers"></ListBox>
        
</StackPanel>
    
</ScrollViewer>


</UserControl>

 

  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;
using Domain.Entity;

namespace Silverlight
{
    
public partial class sldbdemo : UserControl
    {
        ServiceCustomerClient client;
        SysUser _sysUser;
        
private int _customerId = 1;
        
public sldbdemo()
        {
         
            InitializeComponent();
            client 
= new ServiceCustomerClient();
            client.ClientCredentials.UserName.UserName 
= "adminstrator";
            client.ClientCredentials.UserName.Password 
= "123.com";
            _sysUser 
= new SysUser() { UserName = "swb", Password = "swb" };
          
       
           
            client.SayHelloAsync(_sysUser);
            client.SayHelloCompleted 
+= new EventHandler<SayHelloCompletedEventArgs>(client_SayHelloCompleted);
        }

        
void client_SayHelloCompleted(object sender, SayHelloCompletedEventArgs e)
        {
            
try
            {
                MessageBox.Show(e.Result);
            }
            
catch (Exception ex)
            {
                MessageBox.Show(ex.Message 
+ ex.InnerException.Message);
            }
        }
        
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)
        {
          
//  Customer customer = new Customer() { CustomerId = 1, CustomerCode = "ss", CustomerName = "dddd" };
            
//LayoutRoot.DataContext = customer;
            LayoutRoot.DataContext = e.Result;
        }
        
protected void LoadCustomers()
        {
            
try
            {
                client.GetAllCompleted 
+= new EventHandler<GetAllCompletedEventArgs>(client_GetAllCompleted);
                client.GetAllAsync();
            }
            
catch (Exception ex)
            {
                MessageBox.Show(ex.Message 
+ ex.InnerException.Message);
            }
        }
        
void client_GetAllCompleted(object sender, GetAllCompletedEventArgs e)
        {
            System.Windows.Data.PagedCollectionView page 
= new System.Windows.Data.PagedCollectionView(e.Result);
            tempPager.Source 
= page;
            dataGrid.ItemsSource 
= page;

        }

        
private void btnOk_Click(object sender, RoutedEventArgs e)
        {
            
try
            {
                client.AddCompleted 
+= new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(client_AddCompleted);
                Domain.Entity.Customer customer 
= new Domain.Entity.Customer()
                {
                    CustomerId 
= int.Parse(customerId.Text),
                    CustomerCode 
= customerCode.Text,
                    CustomerName 
= customerName.Text
                };
                client.AddAsync( customer);
            }
            
catch (Exception ex)
            {
                MessageBox.Show(ex.Message 
+ ex.InnerException.Message);
            }
        }



        
void client_AddCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            
            LoadCustomers();
        }

        
private void btnLoadData_Click(object sender, RoutedEventArgs e)
        {
            client.GetAllAsync();
            client.GetAllCompleted 
+=new EventHandler<GetAllCompletedEventArgs>(client_GetAllCompleted1);
        }
        
void client_GetAllCompleted1(object sender, GetAllCompletedEventArgs e)
        {
            lstCustomers.ItemsSource 
= e.Result;

        }

        
private void btnGetCustomer_Click(object sender, RoutedEventArgs e)
        {
            GetCustomerById(_customerId);
        }

        
private void btnGetAllCustomer_Click(object sender, RoutedEventArgs e)
        {
            LoadCustomers();
        }

    }
}

 

 

  效果图

  

  你会看到后面的listbox中,数据显示的全部都是Domain.Entity.Customer,没有显示成我们想要的某一栏的值,这就是因为在代码中我们使用了lstCustomers.ItemsSource = e.Result;第一种绑定集合的属性,这时候就需要第二种绑定集合的属性 DisplayMemberPath="CustomerName"登场了。

  其实实现上面的效果,你可以有三条途径:

  1)设置控件的DisplayMemberPath属性为一个对象的属性名称,例如:DisplayMemberPath="CustomerName",效果如下图

  2)重写对象的ToString()方法,提供一些有用的信息,设置可以显示几个属性,因为默认绑定使用的就是对象的tostring方法

  

 

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->public override string ToString()
        {
            
return string .Format ("用户代码:{0} | 用户姓名:{1}",CustomerCode,CustomerName );
        }

 

  属性就不用修改了,还是<ListBox x:Name="lstCustomers" ></ListBox>,效果如下图

  3)提供一个数据模板,这样你可以显示任何排列好的对象属性值,后面将会讲到这种做法。

 

  到这里你可能又需要两外一个功能了,就是点击一个list中的item,在下面显示一下详细信息。你可以响应listbox的SelectionChanged事件,在事件代码中写上

     

 

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> private void lstCustomers_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            gridCustomerDetails.DataContext 
= lstCustomers.SelectedItem;
        }

 

  前台设置为

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> <ListBox x:Name="lstCustomers"color:
分享到:
评论

相关推荐

    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

    这个"一步一步学Silverlight 2系列"的学习资源旨在帮助初学者逐步掌握Silverlight 2的基本概念和技术。 Silverlight 2是该技术的一个重要版本,它在Silverlight 1的基础上进行了大量扩展,提供了更多的功能和API,...

    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中给DataGrid赋值

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

    Silverlight分页源码

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

    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