1

我设置了一个MultiValidator来检查 2 个文本字段的总和是否等于另一个字段的值。然而,出于某种原因,验证器仅在初始化时验证一次。初始化后,它总是会成功。失败条件仅在向导中的稍后时间触发(条件在第一个向导页面失败,验证器在第三个页面)。

以下是数据绑定本身的代码以及MultiValidator. 这dbFactory是一个方便的类来设置绑定本身,这部分工作得很好。

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(). 此外,我刚刚发现此代码在其他地方无法正常工作,尽管影响并不大,因为用户无法更改值以使第一个 IF 失败/成功。

所以基本上验证器的问题是它不会在返回ValidationStatus.OK_STATUS所有 IF 的外部后立即更新。

4

1 回答 1

0

看来我找到了问题的解决方案......我用model.getVal().getInvoiceAmount()金额字段的绑定值替换了调用,然后将BigDecimalsin的创建移到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);
于 2019-08-13T11:48:26.413 回答