Привязка данных JFace/Eclipse запускает мультивалидатор в ChangeListener AggregateValidationStatus

У меня есть AggregateValidationStatus с IChangeListener, Слушатель вызывается каждый раз, когда я выбираю / меняю компонент и который мне нужен. Единственная проблема у меня заключается в том, что я должен вызвать validate() метод моего MultiValidator в начале ChangeListener, К сожалению, документации очень мало, и то, что я нашел, мне не помогло.

мой 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);
    }
});

1 ответ

Решение

Ваш AggregateValidationStatus только совокупности по привязкам datBindingContext:

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

MultiValidator не привязан ни к одной привязке, а ко всему контексту. Так что если вы хотите, чтобы ваш AggregateValidationStatus контролировать MultiValidatorКроме того, вы должны использовать другой конструктор:

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

Это должно сделать ручной триггер MultiValidator в handleChanged superfluent.

Другие вопросы по тегам