2014-09-04 4 views
0

SWT 위젯에 DataBinding을 사용하려고합니다.콤보에서 데이터 바인딩 사용

Combo Box을 모델의 기본 String에 연결하는 방법이 있는지 궁금합니다. 그래서 모델에 String, 내보기에 Combo이 있습니까? 표준 방식으로

가 작동하지 않습니다 :

//View 
DataBindingContext ctx = new DataBindingContext(); 
IObservableValue target1 = WidgetProperties.singleSelectionIndex().observe(combo); 
IObservableValue model1 = BeanProperties.value(OutputVariable.class, "type").observe(outputVariable); 
ctx.bindValue(target1, model1); 

//Model 
public void setType(String type) { 
    //TYPES is a constant with the possible Combo values 
    if (contains(TYPES, type)) { 
     String oldType = this.type; 
     this.type = type; 
     firePropertyChange("type", oldType, this.type); 
    }else { 
     throw new IllegalArgumentException(); 
    } 
} 

나도 일을하지 않았다 fireIndexedPropertyChangeMethod을 사용했습니다.

둘을 연결하는 방법이 있습니까? 다른 WidgetProperties 또는 BeanProperties 방법을 사용해야합니까?

해결 방법으로는 콤보 선택 색인을 정의하고 Combo에 연결하고이 색인의 변경 사항을 유형 속성으로 이전하거나 그 반대의 경우에도 새 속성을 사용할 수 있습니다. 그러나 그것은 저에게 큰 해결책으로 보이지 않습니다.

편집 : selectionIndex 속성이있는 솔루션이 작동합니다. 그러나 모델의 type 속성 변경은 selectionIndex를 재설정해야하고, 그 반대로도 이제는 더 깨끗한 메소드가 유용 할 것입니다.

답변

0

저는 지금 변환기를 사용하는 깨끗한 해결책이 있습니다.

//View 
    IObservableValue comboObservable = WidgetProperties.singleSelectionIndex().observe(combo); 
    IObservableValue viewTypeObservable = BeanProperties.value(DebugModel.class, "type").observe(debugModel); 

    IConverter viewTypeToIntConverter = createViewTypeToIntConverter(); 
    UpdateValueStrategy toTargetStrategy = new UpdateValueStrategy(); 
    toTargetStrategy.setConverter(viewTypeToIntConverter); 

    IConverter intToViewTypeConverter = createIntToViewTypeConverter(); 
    UpdateValueStrategy toModelStrategy = new UpdateValueStrategy(); 
    toModelStrategy.setConverter(intToViewTypeConverter); 

    DataBindingContext context = new DataBindingContext(); 
    context.bindValue(comboObservable, viewTypeObservable, toModelStrategy, toTargetStrategy); 

//Converter 
private IConverter createIntToViewTypeConverter() { 
    return new IConverter() { 

     @Override 
     public Object convert(Object value) { 
      if(value instanceof Integer) { 
       for(ViewType type : ViewType.values()) { 
        if(type.toString().equals(ViewType.getStringAtIndex((int)value))) { 
         return type; 
        } 
       } 
      } 
      throw new IllegalArgumentException("We need an Integer to convert it but got an " + value.getClass()); 
     } 

     @Override 
     public Object getFromType() { 
      return Integer.class; 
     } 

     @Override 
     public Object getToType() { 
      return ViewType.class; 
     } 

    }; 
} 

private IConverter createViewTypeToIntConverter() { 
    return new IConverter() { 

     @Override 
     public Object convert(Object value) { 
      if(value instanceof ViewType) { 
       String[] viewTypes = ViewType.getStringValues(); 
       for(int i=0;i<viewTypes.length;i++) { 
        if(viewTypes[i].equals(((ViewType)value).toString())) { 
         return i; 
        } 
       } 
      } 
      throw new IllegalArgumentException("We need a View Type to be converted but got a " + value.getClass()); 
     } 

     @Override 
     public Object getFromType() { 
      return ViewType.class; 
     } 

     @Override 
     public Object getToType() { 
      return Integer.class; 
     } 

    }; 
} 

//Model 
public class DebugModel extends ModelObject { 
    private ViewType type; 
    public ViewType getType() { 
     return type; 
    } 

    public void setType(ViewType type) { 
     firePropertyChange("type", this.type, this.type = type); 
    } 
} 

//Just to complete the example, be sure the Model class extends a ModelObject class like this 
public class ModelObject { 
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
     this); 

    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     changeSupport.addPropertyChangeListener(listener); 
    } 

    public void removePropertyChangeListener(PropertyChangeListener listener) { 
     changeSupport.removePropertyChangeListener(listener); 
    } 

    public void addPropertyChangeListener(String propertyName, 
     PropertyChangeListener listener) { 
     changeSupport.addPropertyChangeListener(propertyName, listener); 
    } 

    public void removePropertyChangeListener(String propertyName, 
     PropertyChangeListener listener) { 
     changeSupport.removePropertyChangeListener(propertyName, listener); 
    } 

    protected void firePropertyChange(String propertyName, Object oldValue, 
     Object newValue) { 
     changeSupport.firePropertyChange(propertyName, oldValue, newValue); 
    } 

    protected void fireIndexedPropertyChange(String propertyName, int index, Object oldValue, Object newValue) { 
     changeSupport.fireIndexedPropertyChange(propertyName, index, oldValue, newValue); 
    } 
} 

물론 변환기를 사용자 지정 클래스에 아웃소싱 할 수 있습니다. 여기서는 빠른 솔루션을 보여주기 위해이 방법을 사용했습니다.

관련 문제