This tutorial is not yet updated to use the new Properties API which is as of Eclipse 3.5 the recommended way of using databinding. For a tutorial which uses the Properties API please see [http://www.vogella.com/articles/EclipseDataBinding/article.html Eclipse JFace Databinding and Validation - Tutorial]

=== Terms ===

=== Terms ===

----

----

Line 112:

Line 114:

<p>As another nested inner Class, you'll find Class '''FirstWizardPage'''. In createControl method, a DataBindingContext is instantiated at first, no news right here. The binding is created with this code:</p>

<p>As another nested inner Class, you'll find Class '''FirstWizardPage'''. In createControl method, a DataBindingContext is instantiated at first, no news right here. The binding is created with this code:</p>

<pre>

<pre>

−

dbc.bindValue(SWTObservables.observeText(text, SWT.Modify),

+

dbc.bindValue(

+

SWTObservables.observeText(text, SWT.Modify),

((SampleWizard) getWizard()).getModel().intValue,

((SampleWizard) getWizard()).getModel().intValue,

new UpdateValueStrategy().setAfterConvertValidator(new SingleDigitValidator()),

new UpdateValueStrategy().setAfterConvertValidator(new SingleDigitValidator()),

−

null);

+

null

+

);

</pre>

</pre>

<p>Oooh, what a monster. Fortunately, you have already some good knowledge to understand whats going on here. The first parameter is a Target IObservableValue bound to the Wizards Text control. It's provided with a SWT.Modify event, which means that anytime, the controls text changes, the Data Binding mechanism is invoked. The second parameter is the already dicussed WritableValue. Remember, it's an IObservableValue implementation, so again, we deal with two Observables. The third parameter ist the most interessting and new part of the story: first, a new '''UpdateValueStrategy''' is instantiated. This is required, when you have to deal with:

<p>Oooh, what a monster. Fortunately, you have already some good knowledge to understand whats going on here. The first parameter is a Target IObservableValue bound to the Wizards Text control. It's provided with a SWT.Modify event, which means that anytime, the controls text changes, the Data Binding mechanism is invoked. The second parameter is the already dicussed WritableValue. Remember, it's an IObservableValue implementation, so again, we deal with two Observables. The third parameter ist the most interessting and new part of the story: first, a new '''UpdateValueStrategy''' is instantiated. This is required, when you have to deal with:

Line 136:

Line 140:

<p>In our case, the method setAfterConvertValidator(IValidator validator) is called, which invokes the validator after the source value is converted to the type of the destination observable. setAfterConvertValidator eats an IValidator as param. This one is offered as another inner Class nested in Class FirstWizardPage. It simply checks, whether incoming value is between 0 and 9. If not, a '''ValidationStatus(IStatus.ERROR, message)''' is returned, resulting WizardPage1 moaning about the wrong value:</p>

<p>In our case, the method setAfterConvertValidator(IValidator validator) is called, which invokes the validator after the source value is converted to the type of the destination observable. setAfterConvertValidator eats an IValidator as param. This one is offered as another inner Class nested in Class FirstWizardPage. It simply checks, whether incoming value is between 0 and 9. If not, a '''ValidationStatus(IStatus.ERROR, message)''' is returned, resulting WizardPage1 moaning about the wrong value:</p>

As you may have noticed, the Person class extends ModelObject. If you want to bind your domain models, you'll have to ensure support for PropertyChangeSupport. The easiest way to achieve this, is to extend Model Object. You'll find a suitable Template in org.eclipse.jface.examples.databinding package.

To create your first binding, you need to instantiate a DataBindingContext. Create a method like this:

Again, you'll find an IObservableValue, but with a few differences to our first example. First, it is instantiated as a WritableValue(Object initialValue, Object valueType). This is a mutable implementation of IObservableValue that will maintain a value and fire change events when the value changes. Second, the IObservableValue is instantiated inside the Model, differently from our first example. If you are in a situation where you can't get PropertyChangeSupport by extending a class similar to ModelObject, this variant may be a good alternative.

As another nested inner Class, you'll find Class FirstWizardPage. In createControl method, a DataBindingContext is instantiated at first, no news right here. The binding is created with this code:

Oooh, what a monster. Fortunately, you have already some good knowledge to understand whats going on here. The first parameter is a Target IObservableValue bound to the Wizards Text control. It's provided with a SWT.Modify event, which means that anytime, the controls text changes, the Data Binding mechanism is invoked. The second parameter is the already dicussed WritableValue. Remember, it's an IObservableValue implementation, so again, we deal with two Observables. The third parameter ist the most interessting and new part of the story: first, a new UpdateValueStrategy is instantiated. This is required, when you have to deal with:

Validation

Conversion

Automatic processing

in your binding.

It offers five phases for manipulation where you can hook on:

Validate after get

Conversion

Validate after conversion

Validate before set

Value set

You may have a look to the UpdateValueStrategy JavaDocs, which are quite voluminously documented, for further information.

In our case, the method setAfterConvertValidator(IValidator validator) is called, which invokes the validator after the source value is converted to the type of the destination observable. setAfterConvertValidator eats an IValidator as param. This one is offered as another inner Class nested in Class FirstWizardPage. It simply checks, whether incoming value is between 0 and 9. If not, a ValidationStatus(IStatus.ERROR, message) is returned, resulting WizardPage1 moaning about the wrong value: