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.

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

  • 相关阅读:
    Codeforces 877 C. Slava and tanks
    Codeforces 877 D. Olya and Energy Drinks
    2017 10.25 NOIP模拟赛
    2017 国庆湖南 Day1
    UVA 12113 Overlapping Squares
    学大伟业 国庆Day2
    51nod 1629 B君的圆锥
    51nod 1381 硬币游戏
    [JSOI2010]满汉全席
    学大伟业 2017 国庆 Day1
  • 原文地址:https://www.cnblogs.com/chenkai/p/2027691.html
Copyright © 2011-2022 走看看