2013-12-20 65 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); 
    } 
} 
相關問題