我有一个模型项的ObservableList。模型项启用了属性绑定(setter触发属性更改事件)。该列表是TableViewer的内容提供者,允许进行单元格编辑。我还打算通过TableViewer添加一种添加新行(模型项)的方法,这样列表中的项目数可能会随时间变化。
到目前为止,这么好。
因为这都在eclipse编辑器中,所以我想知道模型何时发生变化。我只需要从任何已更改的模型项中更改一个事件,以便将编辑器设置为“脏”。我想我可以为每个单独的列表项对象附加某种监听器,但我想知道是否有一种聪明的方法来做到这一点。
答案 0 :(得分:0)
我认为我可能有一个解决方案。以下类是内联文本编辑器。使用doCreateElementObservable
中添加的侦听器拾取对模型bean(所有实例)的更改。我的eclipse编辑器只需添加其自己的变更监听器即可随时了解。
public class InlineEditingSupport extends ObservableValueEditingSupport
{
private CellEditor cellEditor;
private String property;
private DataBindingContext dbc;
IChangeListener changeListener = new IChangeListener()
{
@Override
public void handleChange(ChangeEvent event)
{
for (ITableEditorChangeListener listener : listenersChange)
{
listener.changed();
}
}
};
public InlineEditingSupport(ColumnViewer viewer, DataBindingContext dbc, String property)
{
super(viewer, dbc);
cellEditor = new TextCellEditor((Composite) viewer.getControl());
this.property = property;
this.dbc = dbc;
}
protected CellEditor getCellEditor(Object element)
{
return cellEditor;
}
@Override
protected IObservableValue doCreateCellEditorObservable(CellEditor cellEditor)
{
return SWTObservables.observeText(cellEditor.getControl(), SWT.Modify);
}
@Override
protected IObservableValue doCreateElementObservable(Object element, ViewerCell cell)
{
IObservableValue value = BeansObservables.observeValue(element, property);
value.addChangeListener(changeListener); // ADD THIS LINE TO GET CHANGE EVENTS
return value;
}
private List<ITableEditorChangeListener> listenersChange = new ArrayList<ITableEditorChangeListener>();
public void addChangeListener(ITableEditorChangeListener listener)
{
listenersChange.remove(listener);
listenersChange.add(listener);
}
public void removeChangeListener(ITableEditorChangeListener listener)
{
listenersChange.remove(listener);
}
}