基于Silverlight DataGrid中无代码设置开始与结束日期DatePicker的实现方法
发布时间:2023-05-04 16:34:50
有时候会碰到一些需要设置开始日期和结束日期的需求,比如有很多商品,每件商品都有开始出售日期和结束出售日期的字段。如何使用DatePicker控件来满足这些需求呢,下文将做解答:
1:新建SL4项目文件。新建Page页面DatePickerDemo.xaml;
2:新建实体类Product,包含SellBegin,SellEnd 字段。代码如下:
public class Product
{
public DateTime SellBegin { get; set; }
public DateTime SellEnd { get; set; }
}
3:由于有多个Product,所以使用DataGrid显示数据,从工具箱中拖一个DataGrid到DatePickerDemo页面。删除多余的代码,最后的结果如下:
<navigation:Page x:Class="SLStudy.DatePickerDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
d:DesignWidth="640" d:DesignHeight="480"
Title="DatePickerDemo Page" Loaded="Page_Loaded"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
<Grid x:Name="LayoutRoot">
<sdk:DataGrid Name="dataGrid1">
</sdk:DataGrid>
</Grid>
</navigation:Page>
后台CS代码为:
dataGrid1.ItemsSource=new List<Product>(){...};
运行实例:结果如下:
当然如果日期格式是这样的,那用户估计会找你麻烦了。默认的日期格式应该”2010/05/05”。
为什么前台xaml代码仅仅这样写,就可以成功的绑定数据呢?
<sdk:DataGrid Name="dataGrid1"> </sdk:DataGrid>
原因在于dataGrid1的AutoGenerateColumns 属性默认是true,为了实现自定义,在这里将它设置为false,并手动添加Column。代码如下:
<sdk:DataGrid Name="dataGrid1" AutoGenerateColumns="False">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="起始日期" Binding="{Binding SellBegin}" />
<sdk:DataGridTextColumn Header="结束日期" Binding="{Binding SellEnd}" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>
运行,结果如下:
但是编辑界面是一个文本框,用户希望的是一个日期选择框,所以需要在单元格编辑的时候,使用DataPicker。
所以需要将<sdk:DataGridTextColumn Header="起始日期" Binding="{Binding SellBegin}" />
修改为使用DataGridTemplateColumn ,代码如下:
<sdk:DataGridTemplateColumn Header="起始日期">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding SellBegin}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
<sdk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<my:DatePicker SelectedDate="{Binding SellBegin}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellEditingTemplate>
</sdk:DataGridTemplateColumn>
运行效果如下:
通过运行发现,虽然选择了日期,但是起始日期的值并没有变化。为什么?
.......
原来虽然设置了SelectedDate的Binding,但是没有设置Binding的模式(Mode).
于是将DataTemplete中的DatePicker修改为
<my:DatePicker SelectedDate="{Binding SellBegin,Mode=TwoWay}" />
Mode有三种:
OneWay:单向绑定,数据源更改会导致控件的值变化。
OneTime:只绑定一次。
TwoWay:双向绑定,你变我变。
运行后发现值变化了。
虽然值变化了,但是可以看到起始日期明显大于结束日期。
查看DatePicker的各个属性,看到有
DisplayDateStart 和 DisplayDateEnd 属性。
所以我们将起始日期的DisplayDateEnd属性绑定到SellEnd 字段上。结果如下:
<my:DatePicker SelectedDate="{Binding SellBegin,Mode=TwoWay}"
DisplayDateEnd="{Binding SellEnd}"/>
运行结果如下:
好了,剩下最后一步了,就是设置显示的格式了。
第一个要明确的是,我们设置格式的对象是CellTemplete中的TextBlock对象,而不是CellEditingTemplete对象中的DatePicker对象,因为用来显示的是TextBlock对象,而编辑的是DatePicker对象。
查看Binding 的属性,发现有StringFormat属性,代表了格式化字符串。于是修改代码为:
<TextBlock Text="{Binding SellBegin, StringFormat=yyyy-MM-dd}" />
运行,结果如下:
修改结束日期,最后代码如下:
<sdk:DataGrid Name="dataGrid1" AutoGenerateColumns="False">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Header="起始日期">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding SellBegin, StringFormat=yyyy-MM-dd}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
<sdk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<my:DatePicker SelectedDate="{Binding SellBegin,Mode=TwoWay}"
DisplayDateEnd="{Binding SellEnd}"/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellEditingTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="结束日期">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding SellEnd, StringFormat=yyyy-MM-dd}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
<sdk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<my:DatePicker SelectedDate="{Binding SellEnd,Mode=TwoWay}"
DisplayDateStart="{Binding SellBegin}"/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellEditingTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
运行结果如下:


猜你喜欢
- 本文实例讲述了java实现Xml与json之间的相互转换操作。分享给大家供大家参考,具体如下:旁白:最近关于xml与json之间的转换都搞蒙
- 在Android开发中很多时候会遇到一屏显示不下所有内容的现象,那大家也知道这个时候肯定会想到用scrollview来进行滚屏显示。这个时候
- 如图所示的效果相信大家都不陌生,我们可以使用很多种方法去实现此效果,这里自己采用CountDownTimer定时器简单封装下此效果,方便我们
- 前言代理模式,我们这里结合JAVA的静态代理和 * 来说明,类比Spring AOP面向切面编程:增强消息,也是代理模式。而我们的静态代理
- 今天写项目突然出现了无法启动Gradle的bug,如下图然后就看了log日志:这个问题是我第一次看见,然后就开始了各种百度,有说需要在And
- java多线程-同步块Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java 同步块用来避免竞争。
- 在Android上,不止一个途径来侦听用户和应用程序之间交互的事件。对于用户界面里的事件,侦听方法就是从与用户交互的特定视图对象截获这些事件
- C#异常处理总结及简单实例一、异常处理的理解?异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。因此处理这种错误,
- 通过拍照或相册中获取图片,并进行裁剪操作,然后把图片显示到ImageView上。 当然也可以上传到服务器(项目中绝大部分情况是上传
- java中的JsonSerializer用法背景今天在写项目的时候遇到一个问题,项目中有个类中有创建时间和更新时间两个属性,但是单位在后端用
- 针对将特定端口加入到windows系统的防火墙中,使其允许或禁止通过防火墙。其大概思路是:/// <summary> /// 添
- 有些情况下,在开发一些C#小项目的时候,交付给别人用的时候就是单独EXE文件,但是若涉及什么EXCEL,图片什么的时候,比较麻烦,这时候可以
- 背景出现了一次生产事故,事情是这样的,我们有一个项目,Java访问数据库的框架使用的是MyBatis。然后一个业务员在系统中查询了一个订单,
- 将BeanFactory和ApplicationContext作为容器使用在Spring中,BeanFactory和ApplicationC
- 本文研究的主要是Java编程利用openoffice将doc、docx转为pdf的实现代码,具体如下。1. 需要用的软件OpenOffice
- 本文实例讲解了Android自动提取短信验证码解决方案,分享给大家供大家参考,具体内容如下<uses-permission andro
- Android小白第一次写博客,心情无比激动。下面给大家展示一下卫星菜单的实现。1.简单介绍卫星菜单在应用程序中,有很多展示菜单的方式,但其
- 简介在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需
- 前言在使用easyExcel读取文件时,对于Excel的表头,在解析读取时分成不同的状态,需要加以区分.1 环境准备准备一个可以正常访问的S
- 私有构造函数私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他