2012-08-23 49 views
0

我想将索引属性绑定到JFace ComboViewer。如何将索引属性绑定到jface查看器

比方说,我有一个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

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

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

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

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

相关问题