2

次のコードを使用して、ラベルのテキスト値をバックエンドモデルにバインドしています(一部の詳細は省略されています)。

Model model = entry.getModel();
Control nameControl = formToolkit.createLabel(labelPanel, null);

IObservableValue modelValue = BeanProperties.value(model.getClass(), Model.PROPERTY_NAME).observe(model);
IObservableValue widgetValue = SWTObservables.observeText(nameControl);

DataBindingContext context = new DataBindingContext();
UpdateValueStrategy widgetToModel = new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER);
UpdateValueStrategy modelToWidget = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
context.bindValue(widgetValue, modelValue, widgetToModel, modelToWidget);

モデルが変更されると、ラベルのテキストが適切に更新されます。ただし、ラベルのサイズは変更されません。そのため、モデルが長い名前に変更されると、新しい名前は切り捨てられます。短い名前に変更すると、ラベルは本来よりも多くのスペースを占有します。

名前が変更されるたびにラベルの親を呼び出すプロパティ変更リスナー(モデル名またはラベルテキストのいずれか)を追加することを考えましたlayoutが、それはデータバインディングの目的を損なうのではないでしょうか?

4

1 に答える 1

1

さて、あなたはあなたのコントロールのサイズをでバインドすることができます

WidgetProperties.size().observe(nameControl);

コントロールのテキスト(既に持っているオブザーバブル)に追加し、UpdateStrategyにテキストからサイズに変換するIConverterを提供します(テキストが変更されるたびに、テキストを計算してからコントロールのサイズを設定できます)。ラベルのサイズが親のレイアウトマネージャーによって認識されていることを確認してください

于 2012-07-25T08:45:14.323 に答える