JFace 数据绑定 MultiValidator 不重新评估
JFace databinding MultiValidator not reevaluating
我已经设置了一个 MultiValidator
来检查 2 个文本字段的总和是否等于另一个字段的值。然而,出于某种原因,验证器仅在初始化时被验证一次。初始化后,它总是如预期的那样成功。失败条件仅在稍后的向导中触发(第一个向导页面和第三个验证器失败的条件)。
以下是数据绑定本身以及 MultiValidator
的代码。 dbFactory
方便 class 自己设置绑定,这部分工作得很好。
fixedFeeAmountBinding = dbFactory.addBinding(fixedFeeAmountTxt, "fixedAmount", null,
new UpdateValueStrategy().setConverter(NumberToStringConverter
.fromBigDecimal(new com.ibm.icu.text.DecimalFormat(Formats.AMOUNT_FORMAT))));
variableFeeAmountBinding = dbFactory.addBinding(variableFeeAmountTxt, "variableAmount", null,
new UpdateValueStrategy().setConverter(NumberToStringConverter
.fromBigDecimal(new com.ibm.icu.text.DecimalFormat(Formats.AMOUNT_FORMAT))));
MultiValidator feeAmountValidaotr = new MultiValidator() {
@Override
protected IStatus validate() {
if (model.getVal().getClientChequePaymentRecordType().equals(ClientChequePaymentRecordType.INVOICE)
&& model.getVal().getInvoiceType() != null
&& !model.getVal().getInvoiceType().equals(InvoiceType.OTHER)) {
BigDecimal fixedAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) fixedFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
BigDecimal variableAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) variableFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
if (fixedAmountValue.add(variableAmountValue).compareTo(model.getVal().getInvoiceAmount()) == 0) {
return ValidationStatus.OK_STATUS;
}
return ValidationStatus.error("Fee Amounts don't add up to Invoice Amount");
}
return ValidationStatus.OK_STATUS; // <-- Doesn't update after returning this
}
};
dbFactory.addValidationStatusProvider(feeAmountValidaotr);
我也曾经从另一个 那里给过小费,但这一次并没有解决我的问题。
让我更难理解这个问题的另一个事实是,完全相同的代码在我的代码的另一个地方运行得很好。
为什么绑定更新时MultiValidator
不更新?以及如何修复它?
如果您需要更多信息,请随时询问。
编辑:
经过更多测试,我发现 ValidationStatusProvider
状态似乎并没有随着 validate()
的新结果而更新。另外我刚刚发现这段代码在其他地方不能正常工作,虽然影响不是那么大,因为用户不能将值更改为fail/succeed第一个如果。
所以验证器的问题基本上是它不会在所有 IF 之外返回 ValidationStatus.OK_STATUS
后立即更新。
看来我找到了问题的解决方案...我将 model.getVal().getInvoiceAmount()
调用替换为金额字段的绑定值,然后将 BigDecimals
的创建移动到 IF
。整个代码现在看起来像这样:
MultiValidator feeAmountValidaotr = new MultiValidator() {
@Override
protected IStatus validate() {
// Only validate Fee Amounts if cheque can have fees
BigDecimal fixedAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) fixedFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
BigDecimal variableAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) variableFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
BigDecimal totalAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) amountBinding.getTarget()).getValue()).replaceAll(",", ""));
if (getModelObject().getClientChequePaymentRecordType().equals(ClientChequePaymentRecordType.INVOICE)
&& getModelObject().getInvoiceType() != null
&& !getModelObject().getInvoiceType().equals(InvoiceType.OTHER)) {
if (fixedAmountValue.add(variableAmountValue).compareTo(totalAmountValue) == 0) {
return ValidationStatus.OK_STATUS;
}
return ValidationStatus.error("Fee Amounts don't add up to Invoice Amount");
}
return ValidationStatus.OK_STATUS;
}
};
dbf.addValidationStatusProvider(feeAmountValidaotr);
我已经设置了一个 MultiValidator
来检查 2 个文本字段的总和是否等于另一个字段的值。然而,出于某种原因,验证器仅在初始化时被验证一次。初始化后,它总是如预期的那样成功。失败条件仅在稍后的向导中触发(第一个向导页面和第三个验证器失败的条件)。
以下是数据绑定本身以及 MultiValidator
的代码。 dbFactory
方便 class 自己设置绑定,这部分工作得很好。
fixedFeeAmountBinding = dbFactory.addBinding(fixedFeeAmountTxt, "fixedAmount", null,
new UpdateValueStrategy().setConverter(NumberToStringConverter
.fromBigDecimal(new com.ibm.icu.text.DecimalFormat(Formats.AMOUNT_FORMAT))));
variableFeeAmountBinding = dbFactory.addBinding(variableFeeAmountTxt, "variableAmount", null,
new UpdateValueStrategy().setConverter(NumberToStringConverter
.fromBigDecimal(new com.ibm.icu.text.DecimalFormat(Formats.AMOUNT_FORMAT))));
MultiValidator feeAmountValidaotr = new MultiValidator() {
@Override
protected IStatus validate() {
if (model.getVal().getClientChequePaymentRecordType().equals(ClientChequePaymentRecordType.INVOICE)
&& model.getVal().getInvoiceType() != null
&& !model.getVal().getInvoiceType().equals(InvoiceType.OTHER)) {
BigDecimal fixedAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) fixedFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
BigDecimal variableAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) variableFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
if (fixedAmountValue.add(variableAmountValue).compareTo(model.getVal().getInvoiceAmount()) == 0) {
return ValidationStatus.OK_STATUS;
}
return ValidationStatus.error("Fee Amounts don't add up to Invoice Amount");
}
return ValidationStatus.OK_STATUS; // <-- Doesn't update after returning this
}
};
dbFactory.addValidationStatusProvider(feeAmountValidaotr);
我也曾经从另一个
让我更难理解这个问题的另一个事实是,完全相同的代码在我的代码的另一个地方运行得很好。
为什么绑定更新时MultiValidator
不更新?以及如何修复它?
如果您需要更多信息,请随时询问。
编辑:
经过更多测试,我发现 ValidationStatusProvider
状态似乎并没有随着 validate()
的新结果而更新。另外我刚刚发现这段代码在其他地方不能正常工作,虽然影响不是那么大,因为用户不能将值更改为fail/succeed第一个如果。
所以验证器的问题基本上是它不会在所有 IF 之外返回 ValidationStatus.OK_STATUS
后立即更新。
看来我找到了问题的解决方案...我将 model.getVal().getInvoiceAmount()
调用替换为金额字段的绑定值,然后将 BigDecimals
的创建移动到 IF
。整个代码现在看起来像这样:
MultiValidator feeAmountValidaotr = new MultiValidator() {
@Override
protected IStatus validate() {
// Only validate Fee Amounts if cheque can have fees
BigDecimal fixedAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) fixedFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
BigDecimal variableAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) variableFeeAmountBinding.getTarget()).getValue())
.replaceAll(",", ""));
BigDecimal totalAmountValue = new BigDecimal(
String.valueOf(((IObservableValue) amountBinding.getTarget()).getValue()).replaceAll(",", ""));
if (getModelObject().getClientChequePaymentRecordType().equals(ClientChequePaymentRecordType.INVOICE)
&& getModelObject().getInvoiceType() != null
&& !getModelObject().getInvoiceType().equals(InvoiceType.OTHER)) {
if (fixedAmountValue.add(variableAmountValue).compareTo(totalAmountValue) == 0) {
return ValidationStatus.OK_STATUS;
}
return ValidationStatus.error("Fee Amounts don't add up to Invoice Amount");
}
return ValidationStatus.OK_STATUS;
}
};
dbf.addValidationStatusProvider(feeAmountValidaotr);