Silverlight 5 Beta新特性[5]隐式模板支持

继续更新Silverlight 5 Beta新特性.在Silverlight 5 BEta更新出来新特性中有一些是WPF已经存在的影子.类似前面提到的多窗体[Multiple Window Support].其实很多熟悉WPF同学应该能看到隐式模板[Implicit DataTemplates]也是借鉴WPF而来.Silverlight 4中DataTemplate在非UI项实现数据绑定模板可以多处重用.大大增加数据显示多样性提高重用的效率.当然在Silverlight 5 Beta增加了Implicit DataTemplate隐式模板.提供一些新的功能:

Silverlight 5 Implicit DataTemplate: 
[1]ContentPresenter的DataTemplates可以选择基于某个数据类型进行相关联绑定 
[2]隐式定义DataTemplates 
[3]当数据源DataContent发生变化时.动态更新的ContentPresenter DataTemplate 
[4]在适当范围启用的DataTemplates
 

类似我们现在定义一项需求:星级酒店推出系统中包含多个服务:RoomService[客房服务]/Communication[外接服务]当我们把服务绑定UI上供给用户选择时通常采用DataTemplate方式进行绑定呈现.这时一种简单通用的方式.定义服务的实体类:

 
 
  1. public class Room     
  2.    {     
  3.        public string RoomId { get; set; }     
  4.        public string RoomName { get; set; }     
  5.        public string RoomType { get; set; }     
  6.    }     
  7.      
  8.    public class RoomService :Room     
  9.    {    
  10.        public string ServiceId { get; set; }    
  11.        public string ServiceName { get; set; }    
  12.        public double ServicePrice { get; set; }    
  13.        public DateTime ServiceDate { get; set; }    
  14.    }    
  15.  
  16.    public class RoomCommunication : Room    
  17.    {    
  18.        public string CommClientID { get; set; }    
  19.        public int CommSpyCounter { get; set; }    
  20.    } 

模拟提供数据源:

 
 
  1. public class VipRoom_Service     
  2.    {     
  3.        public static IList<Room> GetRoomServiceDataRecord()     
  4.        {     
  5.            List<Room> getDataRoomService = new List<Room>();     
  6.            getDataRoomService.Add( new Room {  RoomName="StandBy_Phone_Convert"});     
  7.            getDataRoomService.Add( new RoomService() { RoomName = "DUIUser_DataType_Room"});     
  8.            getDataRoomService.Add( new RoomService() { RoomName = "VIPService_DataType_Room"});     
  9.            getDataRoomService.Add( new RoomCommunication() { RoomName = "Communication_Client_Room" });    
  10.            return getDataRoomService;    
  11.        }    
  12.    } 

定义需要数据绑定ViewModel:

 
 
  1. public class RoomService_ViewModel :INotifyPropertyChanged     
  2.     {     
  3.         public event PropertyChangedEventHandler PropertyChanged;     
  4.        
  5.         public ObservableCollection<Room> serviceList=new ObservableCollection<Room>();     
  6.         public ObservableCollection<Room> ServiceList     
  7.         {     
  8.             get {return this.serviceList; }     
  9.             set {this.serviceList = value; }    
  10.         }    
  11.      
  12.         public void SpiltHandleBaseDataList()    
  13.         {    
  14.             if (this.serviceList != null)    
  15.             {    
  16.                 var getresult = VipRoom_Service.GetRoomServiceDataRecord();    
  17.                 if (getresult.Count > 0)    
  18.                 {    
  19.                     foreach (Room getService in getresult)    
  20.                         serviceList.Add(getService);    
  21.                 }    
  22.             }    
  23.         }    
  24.                 
  25.     } 

在UI呈现中做数据绑定:

 
 
  1. <Grid x:Name="LayoutRoot" Background="White" Margin="30" >     
  2.        <TextBlock Text="This Common DataBind About Itemlist!" FontSize="14"></TextBlock>     
  3.        <ListBox   HorizontalAlignment="Center" VerticalAlignment="Center"     
  4.                   ItemsSource="{Binding ServiceList}"      
  5.                   ScrollViewer.VerticalScrollBarVisibility="Visible"     
  6.                   Margin="167,47,172,112" Width="401" Height="181"></ListBox>     
  7.      
  8.    </Grid> 

这种方式很简单直接把需要所有服务主题提供了给了用户.:

但是系统需求发生变化后 我们需要在酒店服务系统需要提供订飞机票服务时.你会发现这种方式呈现使我们的DataBinding的数据源发生变化.在代码改动代价上前段UI和后台数据绑定都需要修改.这让人情何以堪.而今天提到Silverlight 5 Beta中隐式模板则彻底解决这个问题.

当我们在同一个数据加入N数据服务实体对象[存在FirstEntity/SecendEntity/ThreeEntit…N个] 因此我们需要要更加智能化.在数据源发生变动后.前段绑定数据UI能够根据数据源来进行自动识别绑定.而这就是Implicit Template隐式模板所做的工作.定义Template:

 
 
  1. <UserControl.Resources>     
  2.         <DataTemplate DataType="model:Room">     
  3.             <TextBlock Text="{Binding RoomName}" />     
  4.         </DataTemplate>     
  5.         <DataTemplate DataType="model:RoomService">     
  6.             <TextBlock Text="{Binding ServiceName}" />     
  7.         </DataTemplate>     
  8.         <DataTemplate DataType="model:RoomCommunication">     
  9.             <TextBlock Text="{Binding CommSpyCounter}" />    
  10.         </DataTemplate>    
  11.     </UserControl.Resources> 

做了如上绑定.则无需修改后台数据绑定.当数据发生变更时依然在前台UI会根据DataContent数据绑定服务实体对象[FirstEntity/SecondEntity/ThreeEntity]数据类型时则会使用定义DataTemplate模板中绑定相同数据类型的模板执行.这种方式很方便解决与某个数据类型进行直接关联而非统一的DataContent.另外一个问题数据发生改变动态更新使用对应DataTemplate.

数据模板是很好的方式来规范应用程序中数据绑定的格式。有了它们,可能会发现自己重新思考如何着手重用样式和格式,可能使用更多的内容较少的直接控制和应用的样式.



本文转自chenkaiunion 51CTO博客,原文链接:http://blog.51cto.com/chenkai/763591

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值