使自定义小部件可观察?

时间:2011-09-23 02:11:57

标签: data-binding eclipse-rcp jface

我创建了一个简单的关键字突出显示编辑器,它只包含一个StyledText小部件:

public class SQLSegmentEditor extends Composite {

    private StyledText st;

    public SQLSegmentEditor(Composite parent) {
        super(parent, SWT.NONE);
        this.setLayout(new FillLayout());
        st = new StyledText(this, SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
        st.addLineStyleListener(new SQLSegmentLineStyleListener());
    }

}

如何使其可用于数据绑定?我正在寻找合适的方式,而不仅仅是让它发挥作用的方式。

我想观察内部StyledText的文字内容。

例如:我可以添加一个getStyledText方法来返回包装的StyledText小部件,以便在数据绑定中使用它。但这将带来风险。为了保持我的编辑器行为正确,我应该保持StyledText窗口小部件对客户端代码不可见。

1 个答案:

答案 0 :(得分:3)

虽然我不理解你没有将包装好的窗口小部件暴露给客户端的论点,但这是一个可能的解决方案。窗口小部件可以提供WritableValue,可以通过客户端的数据绑定直接绑定。这意味着绑定超过了3个方:客户端目标,包装可写值和SWT源。唯一的缺点是您在窗口小部件中直接依赖于Databinding。这是一个片段。

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;

public class SQLSegmentEditor extends Composite {

    private final StyledText st;

    private final WritableValue value = new WritableValue();

    public SQLSegmentEditor(Composite parent, DataBindingContext ctx) {
        super(parent, SWT.NONE);
        assert ctx != null;
        setLayout(new FillLayout());
        st = new StyledText(this, SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
        ISWTObservableValue swtBinding = WidgetProperties.text(SWT.Modify)
                .observe(st);
        ctx.bindValue(value, swtBinding);
    }

    public WritableValue getValue() {
        return value;
    }
}

所以客户端代码看起来像:

DataBindingContext ctx = new DataBindingContext();
SQLSegmentEditor sqlSegmentEditor = new SQLSegmentEditor(getParent(), ctx);
IObservableValue modelObservable = //setup my model-observable
ctx.bindValue(modelObservable, sqlSegmentEditor.getValue());