【问题标题】:How can I observe the changed state of model items in an ObservableList?如何观察 ObservableList 中模型项的更改状态?
【发布时间】:2013-12-20 21:14:33
【问题描述】:
我有一个模型项目的 ObservableList。模型项已启用属性绑定(setter 触发属性更改事件)。该列表是允许单元格编辑的 TableViewer 的内容提供者。我还打算添加一种通过 TableViewer 添加新行(模型项)的方法,因此列表中的项数可能会随时间而变化。
到目前为止,一切都很好。
由于这一切都在 Eclipse 编辑器中,我想知道模型何时更改。我只需要来自任何更改的模型项的一个更改事件即可将编辑器设置为“脏”。我想我可以为每个单独的列表项对象附加某种侦听器,但我想知道是否有一种聪明的方法可以做到这一点。
【问题讨论】:
标签:
eclipse
data-binding
jface
【解决方案1】:
我想我可能有一个解决方案。下面的类是一个内联文本编辑器。使用 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);
}
}