2013-12-20 27 views
0

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

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

回答

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); 
    } 
} 
相关问题