我想将索引属性绑定到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);
但它不起作用。
是否可以绑定索引属性而不是简单属性?怎么样?
答案 0 :(得分:0)
不幸的是,这似乎不受支持。我一直在寻找完全相同的功能。 BeanProperties中没有文档表明它受支持。
在查看BeanProperties.value的实现时,您会发现它委托给BeanPropertyHelper来读取和编写属性。方法Object readProperty(Object source, PropertyDescriptor propertyDescriptor)
不了解子类IndexedPropertyDescriptor。当为索引属性调用它时,readProperty尝试使用读取整个数组的read方法。我认为这个方法对于索引属性是可选的。对于索引属性,它应该使用IndexedPropertyDescriptor.getIndexedReadMethod()。
根据您的使用案例,您可以使用BeanProperties.list解决问题。但是,您不能将其与索引属性结合使用。我尝试通过添加一个方法来返回整个数组,但仍然保持执行“fireIndexedPropertyChange”的方法。不幸的是,这给出了一个ClassCastException:Eclipse的BeanListProperty似乎假设change事件中的值是一个数组或列表。但是对于索引属性,它是数组的单个元素。
或许您可以使用可观察的地图?