JFace/Eclipse AggregateValidationStatus 的 ChangeListener 中的数据绑定触发多重验证器

JFace/Eclipse databinding trigger multivalidator in ChangeListener of AggregateValidationStatus

我有一个 AggregateValidationStatus 和一个 IChangeListener。每次我 select/change 和我需要的组件时都会调用监听器。我遇到的唯一问题是我必须在 ChangeListener 的开头触发 MultiValidatorvalidate() 方法。遗憾的是,文档非常少,我发现的内容对我没有帮助。

我的ChangeListener

final AggregateValidationStatus aggregateValidationStatus = new AggregateValidationStatus(
        dataBindingContext.getBindings(), AggregateValidationStatus.MAX_SEVERITY);
aggregateValidationStatus.addChangeListener(new IChangeListener() {
    public void handleChange(ChangeEvent event) {
        //Here I have to trigger the MultiValidator to return either OK or ERROR
        boolean formIsValid = true;
        aggregateValidationStatus.getValue();
        for (Object o : dataBindingContext.getBindings()) {
            Binding binding = (Binding) o;
            IStatus status = (IStatus) binding.getValidationStatus().getValue();
            if (!status.isOK()) {
                formIsValid = false;
            }

            Control control = null;
            if (binding.getTarget() instanceof ISWTObservable) {
                ISWTObservable swtObservable = (ISWTObservable) binding.getTarget();
                control = (Control) swtObservable.getWidget();
            }
            if (binding.getTarget() instanceof CalendarComboObservableValue) {
                CalendarComboObservableValue observable = (CalendarComboObservableValue) binding.getTarget();
                control = (Control) observable.getControl();
            }

            if (binding.getTarget() instanceof IViewerObservable) {
                IViewerObservable observable = (IViewerObservable) binding.getTarget();
                control = observable.getViewer().getControl();
            }

            ControlDecoration decoration = decoratorMap.get(control);
            if (decoration != null) {
                if (status.isOK() || status.matches(Status.WARNING)) {
                    decoration.hide();
                } else {
                    decoration.setDescriptionText(status.getMessage());
                    decoration.show();
                }
            }
        }
        if (saveBtn != null)
            saveBtn.setEnabled(formIsValid);
    }
});

您的 AggregateValidationStatus 仅聚合 datBindingContext 的绑定:

final AggregateValidationStatus aggregateValidationStatus = new AggregateValidationStatus(
    dataBindingContext.getBindings(), AggregateValidationStatus.MAX_SEVERITY);

MultiValidator 不是附加到单个绑定,而是附加到整个上下文。因此,如果您希望 AggregateValidationStatus 也监视 MultiValidator,您应该使用不同的构造函数:

final AggregateValidationStatus aggregateValidationStatus = new AggregateValidationStatus(
    dataBindingContext, AggregateValidationStatus.MAX_SEVERITY);

这应该使 handleChanged 中的 MultiValidator 的手动触发器变得非常流畅。