jface databinding:UpdateValueStrategy(数值更新策略)类详解
2016-12-24 17:52
477 查看
在jface databinding(数据绑定框架)中,org.eclipse.core.databinding.UpdateValueStrategy 类(数值更新策略)是个比较重要的类,通过了解它可以更容易理解数据绑定的整个框架,起到提纲挈领的作用。
这个类的作用是定义被绑定的源/目标两个可观察值(observable value)之间数据更新、验证、转换的方式。
关于数据更新的细节,可以参考
org.eclipse.core.databinding.ValueBinding不是public类,online的javaDoc上找不到,所以请看源码
从上面的步骤可以看到,1,3,4都是数据验证过程,用于验证提交给下一步骤的数据的有效性(最重要且常用的是1),每次验证都会将验证结果以状态(IStatus)对象的形式返回(验证通过则状态为IStatus.OK),状态为IStatus.ERROR或IStatus.CANCEL时则终止更新过程。
关于验证器和转换器的使用参见我之前的博客 《jface databinding(数据挷定)中的数据转换(IConverter)和数据验证(IValidator )》
如果你没有调用setConverter方法指定数据转换器,UpdateValueStrategy会根据源/目标观察值(observable value)的数据类型尝试找到合适的转换器(如StringToNumberConverter,NumberToStringConverter)来做为默认转换器,对于简单数据类型(Integer,float,Date…,String),UpdateValueStrategy一般都能找到合适的转换器。
当你使用了默认的converter(没有指定converter),并且没有指定afterGetValidator时,UpdateValueStrategy也会自动找到合适的验证器(IValidator)来作为afterGetValidator的缺省值(参见UpdateValueStrategy.fillDefaults方法源码)(beforeSetValidator,afterConvertValidator没有缺省值);
当你指定了converter时,并且没有指定afterGetValidator时,UpdateValueStrategy就不管afterGetValidator了(为null)。这种情况下,因为没有Validator对从源观察值(observable value)获取(get)的数据进行验证,不合法的数据可能会导致converter在执行数据转换过程抛出异常。
所以为避免这个问题,如果你指定了converter,就必须指定afterGetValidator。
关于这部分逻辑的细节请参考源码。
如何看源码呢?
建议以UpdateValueStrategy.defaultedConverter成员变量(boolean)为线索,沿着该成员变量的调用层次结构查看以下方法的代码,很快就明白了。
UpdateValueStrategy.fillDefaults
UpdateValueStrategy.findValidator
DataBindingContext.bindValue
一般情况下,项目中真正要关注的是验证器(IValidator),对于步骤1,3,4中的这么多验证器,一般情况下1最重要,我们可以根据项目实际需求来定制自己的afterGetValidator(后续再专门撰文说这个问题)。
这个类的作用是定义被绑定的源/目标两个可观察值(observable value)之间数据更新、验证、转换的方式。
数据更新步骤
被绑定的源/目标两个可观察值(observable value)数据之间的数据更新步骤分为:步骤 | 实现方法 | 指定验证器/转换器 |
---|---|---|
1.用getter方法获取源观察值(observable value)数据后验证 | validateAfterGet(Object) | setAfterGetValidator(IValidator) |
2.数据转换 | convert(Object) | setConverter(IConverter) |
3.数据转换后验证 | validateAfterConvert(Object) | setAfterConvertValidator(IValidator) |
4.调用setter方法修改数据之前验证 | validateBeforeSet(Object) | setBeforeSetValidator(IValidator) |
5.调用setter方法修改目标观察值(observable value)数据 | doSet(IObservableValue,Object) |
void org.eclipse.core.databinding.ValueBinding.doUpdate(IObservableValue, IObservableValue, UpdateValueStrategy, boolean, boolean)方法的源码,数据更新的各个步骤就是在这个方法里一步步执行的。
org.eclipse.core.databinding.ValueBinding不是public类,online的javaDoc上找不到,所以请看源码
数据验证
数据验证器(IValidator)用于验证数据的有效性,从上面的步骤可以看到,1,3,4都是数据验证过程,用于验证提交给下一步骤的数据的有效性(最重要且常用的是1),每次验证都会将验证结果以状态(IStatus)对象的形式返回(验证通过则状态为IStatus.OK),状态为IStatus.ERROR或IStatus.CANCEL时则终止更新过程。
关于验证器和转换器的使用参见我之前的博客 《jface databinding(数据挷定)中的数据转换(IConverter)和数据验证(IValidator )》
数据转换
数据转换器(IConverter)用于完成被绑定的两个可观察值(observable value)之间源数据类型到目标数据类型的转换.如果你没有调用setConverter方法指定数据转换器,UpdateValueStrategy会根据源/目标观察值(observable value)的数据类型尝试找到合适的转换器(如StringToNumberConverter,NumberToStringConverter)来做为默认转换器,对于简单数据类型(Integer,float,Date…,String),UpdateValueStrategy一般都能找到合适的转换器。
当你使用了默认的converter(没有指定converter),并且没有指定afterGetValidator时,UpdateValueStrategy也会自动找到合适的验证器(IValidator)来作为afterGetValidator的缺省值(参见UpdateValueStrategy.fillDefaults方法源码)(beforeSetValidator,afterConvertValidator没有缺省值);
当你指定了converter时,并且没有指定afterGetValidator时,UpdateValueStrategy就不管afterGetValidator了(为null)。这种情况下,因为没有Validator对从源观察值(observable value)获取(get)的数据进行验证,不合法的数据可能会导致converter在执行数据转换过程抛出异常。
所以为避免这个问题,如果你指定了converter,就必须指定afterGetValidator。
关于这部分逻辑的细节请参考源码。
如何看源码呢?
建议以UpdateValueStrategy.defaultedConverter成员变量(boolean)为线索,沿着该成员变量的调用层次结构查看以下方法的代码,很快就明白了。
UpdateValueStrategy.fillDefaults
UpdateValueStrategy.findValidator
DataBindingContext.bindValue
自动处理策略
当源观察值(observable value)改变时自动执行前述的更新步骤。可以通过UpdateValueStrategy构造函数中的updatePolicy参数设置更新策略 (比如: POLICY_NEVER, POLICY_CONVERT, POLICY_ON_REQUEST, POLICY_UPDATE). 默认的策略是POLICY_UPDATE;总结
对于一般的简单数据类型(Integer,float,Date,String…),DataBindingContext干得挺好,已经帮我们做了很多事情,DataBindingContext.bindValue方法中有能力找到合适的转换器,所以我们一般并不需要指定转换器(IConverter)。一般情况下,项目中真正要关注的是验证器(IValidator),对于步骤1,3,4中的这么多验证器,一般情况下1最重要,我们可以根据项目实际需求来定制自己的afterGetValidator(后续再专门撰文说这个问题)。
相关文章推荐
- jface databinding:输入无效数值时强制恢复初始值-updateModelToTarget
- jface databinding:重写doSetValue方法ComputedValue实现双向多对一的数据绑定
- jface databinding:延迟计算--ComputedValue和WritableList使用的例子
- jface databinding:构建一个改进版的通用型数值验证器StringToNumberValidator
- oracle 不能更新 PL/SQL 点击“edit data”报“ these query results are not updateable”
- PB中用DataWindow.Update更新数据。
- C# SqlDataAdapter.update结合事务(SqlTransaction)批量更新数据
- C# 数据库sql中用参数的方法来执行UPDATE命令,实现更新dataTime类型
- Flex Data Binding详解
- 从一个案例看MVC中DataContext和UpdateModel的工作原理(详解UpdateModel/SubmitChanges错误)
- DataGridView(C#使用SqlDataAdapter.Update更新数据库)
- 捆绑语法详解 Simplified and Extended Data Binding Syntax in ASP.NET 2.0
- 从一个案例看MVC中DataContext和UpdateModel的工作原理(详解UpdateModel/SubmitChanges错误)
- DLINQ 使用DataContext快速构建数据访问层DAL,发现Updata采用Attach(Entity t,true)困难重重!(如果实体声明了版本成员或者没有更新检查策略,则只能将它附加为没有原始状态的已修改实体)的解决办法!
- 从一个案例看MVC中DataContext和UpdateModel的工作原理(详解UpdateModel/SubmitChanges错误)
- 在C#使用SqlDataAdapter的Update更新数据
- C#使用SqlDataAdapter.Update更新数据库
- eclipse超cool新特性--JFace Data Binding
- 用SqlDataAdapter.Update(DataSet Ds)更新数据库
- Sprinig.net 双向绑定 Bidirectional data binding and data model management 和 UpdatePanel