2017-09-27 90 views
0

我有一个AggregateValidationStatusIChangeListener。每次我选择/更改时都会调用监听器,而这正是我需要的组件。我唯一的问题是我必须在ChangeListener的开头触发我的MultiValidatorvalidate()方法。可悲的是有很低的文件,我发现没有帮助我。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); 
    } 
}); 
+0

您可以添加代码如何创建aggregateValidationStatus? –

+0

@TillmannSeidel更新了代码 – XtremeBaumer

回答

1

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