← 返回所有博客文章

绑定TimeSpan属性

如果你有一个TimeSpan属性从类中暴露出来,你需要绑定C1DataGrid到对象集合,自动生成不能编辑的TimeSpan列。

使用DataGridDateTimeColumn并不适合这种场景,因为DataGridDateTimeColumn列的类型和TimeSpan有所区别。

以上是一种场景,虽然简单,但也很容易。

最简单的处理问题的方法就是给DataGridDateTimeColumn设置CellEditingTemplate为C1TimeEditor。C1TimeEditor控件就是展示TimeSpan数据的特殊控件。如下的xmal代码定义需求的模板:

<c1:DataGridTemplateColumn Header="Time">
 <c1:DataGridTemplateColumn.CellTemplate>
     <DataTemplate>
           <TextBlock Text="{Binding TimeTaken}"/>
     </DataTemplate>
 </c1:DataGridTemplateColumn.CellTemplate>
 <c1:DataGridTemplateColumn.CellEditingTemplate>
      <DataTemplate>
           <c1:C1TimeEditor Format="TimeSpan"  Value="{Binding TimeTaken,Mode=TwoWay}"/>
      </DataTemplate>
 </c1:DataGridTemplateColumn.CellEditingTemplate>
 </c1:DataGridTemplateColumn>

 

一种可以创建自定义列示从DataGridBoundColumn继承,这对于使用AutoGeneratingColumns事件在运行时添加列是非常有用的。

代码参考:

public class DataGridTimeSpanColumn : DataGridBoundColumn
 {
      public DataGridTimeSpanColumn()
      {
           Initialize();
      }

      public DataGridTimeSpanColumn(PropertyInfo property)
           : base(property)
      {
           Initialize();
      }

      protected void Initialize()
      {
           IsReadOnly = false;
      }

      public override object GetCellContentRecyclingKey(C1.Silverlight.DataGrid.DataGridRow row)
      {
           return "TimeEditor";
      }

      public override FrameworkElement CreateCellContent(C1.Silverlight.DataGrid.DataGridRow row)
      {
           var tb = new TextBlock();
           return tb;
      }

      public override void BindCellContent(FrameworkElement cellContent, C1.Silverlight.DataGrid.DataGridRow row)
      {
           var tb = (TextBlock)cellContent;
           var binding = CopyBinding(Binding);
           tb.DataContext = row.DataItem;
           tb.SetBinding(TextBlock.TextProperty, binding);
      }

      public override void UnbindCellContent(FrameworkElement cellContent, C1.Silverlight.DataGrid.DataGridRow row)
      {
           var timeeditor = (TextBlock)cellContent;
           timeeditor.DataContext = null;
      }

      public override FrameworkElement GetCellEditingContent(C1.Silverlight.DataGrid.DataGridRow row)
      {
           var timeeditor = new C1TimeEditor();
           timeeditor.Format = C1TimeEditorFormat.TimeSpan;
           var binding = CopyBinding(Binding);
           timeeditor.SetBinding(C1TimeEditor.ValueProperty, binding);
           return timeeditor;
      }
 }

请在如下链接下载本文的参考示例:

TimeSpanColumn.zip (12.18 kb)

 

C1DataGrid的在线英文产品文档地址:

http://helpcentral.componentone.com/nethelp/C1datagridWPF/

如果你对C1DataGrid感兴趣,请到我们的官网下载最新版本:/download/?pid=6

如果你有疑问,可以到GCDN论坛获得技术支持:http://gcdn.grapecity.com.cn/showforum-138.html

 

C1DataGrid for WPF使用技巧》系列文章

(一)在表头展示合计信息

(二)简单数据绑定

(三)C1DataGrid的条件话数据模板