三、修正绑定数据的显示格式
虽然通过DataBinder实现了对多个控件的批量绑定,但是并不完美。一个显著的问题是:作为生日的字段不仅仅显示了日期,还显示了时间。我们如何让日期按照我们要求的格式进行显示呢?DataBinder为了提供了三种选择。
如果你注意看DataBinder定义了,你会发现它定义了两个事件:DataItemBinding和DataItemBound命名有待商榷),它们分别在对某个控件进行绑定之前和之后触发。我们的第一种方案就是注册DataItemBinding时间,为Birthday指定一个格式化字符串。假设我们需要的格式是“月-日-年”,那么我们指定的格式化字符串:MM-dd-yyyy。事件注册我方在了Page的构造函数中:
- public Default()
- {
- this.DataBinder = new Artech.DataBinding.DataBinder();
- this.DataBinder.DataItemBinding += (sender, args) =>
- {
- if (args.BindingMapping.Control == this.Birthday)
- {
- args.BindingMapping.FormatString = "MM-dd-yyyy";
- }
- };
- }
运行程序,你会发现作为生日的字段已经按照我们希望的格式显示出来:
上面介绍了通过注册DataItemBinding事件在绑定前指定格式化字符串的解决方案,你也可以通过注册DataItemBound事件在绑定后修正显示的日期格式,相应的代码如下:
- public Default()
- {
- this.DataBinder = new Artech.DataBinding.DataBinder();
- this.DataBinder.DataItemBound += (sender, args) =>
- {
- if (args.BindingMapping.Control == this.Birthday && null != args.DataValue)
- {
- this.Birthday.Text = ((DateTime)Convert.ChangeType(args.DataValue, typeof(DateTime))).
- ToString("MM-dd-yyyy");
- }
- };
DataBinder定义了两个BindData重载,我们使用的是通过指定数据源和容器控件的方式,而另一个重载的参数为IEnumerable<BindingMapping>类型。而BindingMapping是我们自定义的类型,用于表示控件和实体属性之间的运行时映射关系。而这样一个BindingMapping集合,可以通过DataBinder的静态方法BuildBindingMappings来创建。BindingMapping具有一个FormatString表示格式化字符串实际上面我们指定的格式化字符串就是为这个属性指定的)。那么,我们也可以通过下面的代码来进行数据绑定:
- protected void ButtonBind_Click(object sender, EventArgs e)
- {
- var customer = new Customer
- {
- ID = Guid.NewGuid().ToString(),
- FirstName = "Zhang",
- LastName = "San",
- Age = 30,
- Gender = "Male",
- BirthDay = new DateTime(1981, 1, 1),
- IsVip = true
- };
- var bindingMappings = Artech.DataBinding.DataBinder.BuildBindingMappings(typeof(Customer), this);
- bindingMappings.Where(mapping => mapping.Control == this.Birthday).First().FormatString = "MM-dd-yyyy";
- this.DataBinder.BindData(customer, bindingMappings);