2012-08-23 91 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事件中的值是一個數組或列表。但是,對於索引屬性,它是數組的單個元素。

或者您可以使用可觀察的地圖嗎?

相關問題