我有RCP应用程序,我有一个命令,它启动一个实体的向导(编辑向导,显示实体的所有字段,用户可以更改它并完成向导以保存此实体)。我正在使用JFace数据绑定将实体的字段绑定到swt Texts和Combos。
该命令有处理程序(包含向导调用),并且此处理程序绑定到某个按钮,一切正常。
然后我需要将此命令绑定到某个组合键(例如Ctrl + E)。我正在使用org.eclipse.ui.bindings扩展:
<key
commandId="com.project.command"
contextId="com.project.view.context"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="M1+E">
</key>
“com.project.view.context”是由我在两个不同的视图中绑定到相同的组合键并且看起来没问题(并在这两个视图中激活不同的命令)。
但是当我通过这个组合键打开我的向导时,出现了一个问题:
SWT文本字段不绑定到实体的整数字段。使用String字段,一切正常,它们的绑定很好。但是整数字段不是(其中只有空格)。
我尝试了什么:
我调试了向导和向导页面,并且所有时间实体状态都是 罚款(他们的整数字段是正确的,而不是0或null)
尝试将整数写入字符串转换器以进行JFace绑定。没有帮助。
我尝试禁用此字段的JFace绑定,并设置文本字段 价值手册:
swtTextField.setText(entity.getIntegerField().toString());
但这也没有用!看起来这不是JFace绑定问题, 但是SWT文本有问题吗?调试这种情况:
entity.getIntegerField()。toString()=“1234”之前和之后 “setText”之前和之后的“setText”swtTextField.getText =“”
(当我从Key组合命令调用运行此调试时, 一切看起来不错,“setText”之后的swtTextField.getText =“1234”)
尝试将绑定扩展的上下文更改为默认值 (“org.eclipse.ui.contexts.window”)也没有帮助。
所以,总结一下,当我通过按钮(或上下文菜单)调用我的命令时,一切正常。但是当我通过键组合绑定扩展调用我的命令时,Integer-&gt; Text字段(字符串字段工作正常)存在问题。
有什么想法吗?
补充:我发现,问题在于组合键。当组合键包含非英语键符号(Ctrl +非英语键我的语言键符号,导致我们的应用程序使用非英语键组合)时,问题出现:SWT Text不接受整数值。当键组合为英语(Ctrl + english-key)时 - 一切正常。
所有其他命令(没有SWT文本字段)也可以正常工作,它们也被绑定到Ctrl +非英语键组合......
这很奇怪,我仍然不明白,为什么那个hanneps ...
答案 0 :(得分:1)
org.eclipse.core.databinding.observable.value.IObservableValue
观察您的Text
。因此,您可以编写如下代码:IObservableValue yourTextObserveTextObserveWidget = SWTObservables.observeText(yourText, SWT.Modify);
org.eclipse.core.databinding.beans.BeansObservables
观察您的实体的价值,以便您可以编写如下代码:BeansObservables.observeValue(yourModel, "yourInt");
org.eclipse.core.databinding.DataBindingContext
并绑定IObservableValue
,如下所示:bindingContext.bindValue(yourTextObserveTextObserveWidget, yourModelTemplateObserveValue, null, null)
因此,将模型绑定到Text
的最终代码将如下所示:
DataBindingContext bindingContext = new DataBindingContext();
IObservableValue yourTextObserveTextObserveWidget = SWTObservables.observeText(yourText, SWT.Modify);
IObservableValue yourModelTemplateObserveValue = BeansObservables.observeValue(yourModel, "yourInt");
bindingContext.bindValue(yourTextObserveWidget, yourModelTemplateObserveValue, null, null);
如果您有任何其他问题,请查看数据绑定的文档。这适用于我的String
,boolean
和Integer
类型的计划。我还没有测试过任何其他的东西。