0

我想将索引属性绑定到 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);

但它不起作用。

是否可以绑定索引属性而不是简单属性?如何?

4

1 回答 1

0

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

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

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

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

于 2012-08-28T09:07:41.017 回答