如何在ObservableList中观察模型项的更改状态?

时间:2013-12-20 11:46:44

标签: eclipse data-binding jface

我有一个模型项的ObservableList。模型项启用了属性绑定(setter触发属性更改事件)。该列表是TableViewer的内容提供者,允许进行单元格编辑。我还打算通过TableViewer添加一种添加新行(模型项)的方法,这样列表中的项目数可能会随时间变化。

到目前为止,这么好。

因为这都在eclipse编辑器中,所以我想知道模型何时发生变化。我只需要从任何已更改的模型项中更改一个事件,以便将编辑器设置为“脏”。我想我可以为每个单独的列表项对象附加某种监听器,但我想知道是否有一种聪明的方法来做到这一点。

1 个答案:

答案 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);
    }
}