[英]How do bind indexed property to jface viewer
我想將索引屬性綁定到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);
但這不起作用。
是否可以綁定索引屬性而不是簡單屬性? 怎么樣?
不幸的是,這似乎不受支持。 我一直在尋找完全相同的功能。 BeanProperties中沒有任何文檔說明該文檔受支持。
在研究BeanProperties.value的實現時,您發現它委托給BeanPropertyHelper來讀寫屬性。 方法Object readProperty(Object source, PropertyDescriptor propertyDescriptor)
不了解子類IndexedPropertyDescriptor。 為索引屬性調用它時,readProperty嘗試使用讀取整個數組的read方法。 我認為此方法對於索引屬性是可選的。 對於索引屬性,應使用IndexedPropertyDescriptor.getIndexedReadMethod()。
根據您的用例,您可以使用BeanProperties.list解決該問題。 但是,不能將其與索引屬性一起使用。 我嘗試通過添加一個返回整個數組的方法但仍保留執行“ fireIndexedPropertyChange”的方法來嘗試此操作。 不幸的是,這給出了ClassCastException:Eclipse的BeanListProperty似乎假設change事件中的值是數組或列表。 但是,對於索引屬性,它是數組的單個元素。
也許您可以改用可觀察的地圖?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.