Привязка данных 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.