如何将索引属性绑定到jface查看器

时间:2012-08-23 12:07:36

标签: java data-binding jface indexed-properties

我想将索引属性绑定到JFace ComboViewer。

假设我有一个像这样的DataModel类:

class DataModel {
   private String[] props = {"A","B","C"};
   private PropertyChangeSupport pcs = new PropertyChangeSupport(this);

   public String getProperties( int idx ){
      return props[idx];
   }

   public void setProperties( int idx, String value ){
      String oldVal = props[idx];
      props[idx] = value;
      pcs.fireIndexedPropertyChange( "properties", idx, oldVal, value );
   }

   // code to add/remove PropertyChangeListener
   // ...
}

简单属性的数据绑定代码如下所示:

DataModel dataModel = ...
ComboViewer propertyChoice = ...

DataBindingContext ctx = new DataBindingContext();

IObservableValue target = ViewerProperties.singleSelection().observe( propertyChoice );
IObservableValue model = BeanProperties.value( DataModel.class, "properties" ).observe(dataModel);
ctx.bindValue( target, model ); 

但是使用索引属性我必须通知ctx哪个索引是我想要绑定的值。我试过了

IObservableValue model = BeanProperties.value( DataModel.class, "properties[0]" ).observe(dataModel);

但它不起作用。

是否可以绑定索引属性而不是简单属性?怎么样?

1 个答案:

答案 0 :(得分:0)

不幸的是,这似乎不受支持。我一直在寻找完全相同的功能。 BeanProperties中没有文档表明它受支持。

在查看BeanProperties.value的实现时,您会发现它委托给BeanPropertyHelper来读取和编写属性。方法Object readProperty(Object source, PropertyDescriptor propertyDescriptor)不了解子类IndexedPropertyDescriptor。当为索引属性调用它时,readProperty尝试使用读取整个数组的read方法。我认为这个方法对于索引属性是可选的。对于索引属性,它应该使用IndexedPropertyDescriptor.getIndexedReadMethod()。

根据您的使用案例,您可以使用BeanProperties.list解决问题。但是,您不能将其与索引属性结合使用。我尝试通过添加一个方法来返回整个数组,但仍然保持执行“fireIndexedPropertyChange”的方法。不幸的是,这给出了一个ClassCastException:Eclipse的BeanListProperty似乎假设change事件中的值是一个数组或列表。但是对于索引属性,它是数组的单个元素。

或许您可以使用可观察的地图?