zoukankan      html  css  js  c++  java
  • 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>

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

    2011-04-25_155141

     

     

     

     

     

     

     

    但是系统需求发生变化后 我们需要在酒店服务系统需要提供订飞机票服务时.你会发现这种方式呈现使我们的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.

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

  • 相关阅读:
    pip换国内源
    docker build 的 cache 机制
    jenkins 修改log路径
    lsb_release: command not found 解决
    Linux 添加开机启动项的三种方法
    FAT AP v200R005 配置二层透明模式(web&命令行,开局)
    SharePoint 2010 文档管理系列之星级评论功能
    SharePoint 2010 文档管理之过期归档工具
    SharePoint 2010 文档管理系列之文档搜索
    SharePoint 2010 文档管理系列之准备篇
  • 原文地址:https://www.cnblogs.com/chenkai/p/2027691.html
Copyright © 2011-2022 走看看