AggregateValidationStatus的ChangeListener中的JFace/Eclipse数据绑定触发器多值器
问题描述:
我有一个AggregateValidationStatus
与IChangeListener
。每次我选择/更改时都会调用监听器,而这正是我需要的组件。我唯一的问题是我必须在ChangeListener
的开头触发我的MultiValidator
的validate()
方法。可悲的是有很低的文件,我发现没有帮助我。AggregateValidationStatus的ChangeListener中的JFace/Eclipse数据绑定触发器多值器
我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
S以及,你应该使用不同的构造函数:
final AggregateValidationStatus aggregateValidationStatus = new AggregateValidationStatus(
dataBindingContext, AggregateValidationStatus.MAX_SEVERITY);
这应该使MultiValidator
的手动触发在handleChanged
superfluent。
+0
感谢您的答复,一旦我达到它将尝试它。如果它有效,我会接受答案 – XtremeBaumer
您可以添加代码如何创建aggregateValidationStatus? –
@TillmannSeidel更新了代码 – XtremeBaumer