Home » Eclipse Projects » Eclipse Platform » [data binding] how to make a binding be optional?
| |
Re: [data binding] how to make a binding be optional? [message #875726 is a reply to message #875698] |
Wed, 23 May 2012 08:30 |
David BY Chan Messages: 40 Registered: July 2009 |
Member |
|
|
No, I did not mix the arguments. Here's my example:
EMF Model:
public interface GeneralStatement{
Integer getTimeout();
void setTimeout(Integer value);
}
Binding:
IObservableValue ob_txt_timeout =
SWTObservables.observeText(textTimeout,SWT.Modify);
IObservableValue ob_model_timeout = EMFObservables.observeValue(stmt,
stmt.eClass().getEStructuralFeature(Mapperv2Package.GENERAL_STATEMENT__TIMEOUT));
timeoutBinding = current_binding_context.bindValue(ob_txt_timeout,
ob_model_timeout);
I didn't use any converter because framework defined internal
StringToInteger conveter.
Exception:
java.lang.NumberFormatException: For input string: ""
at
java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:470)
at java.lang.Integer.valueOf(Integer.java:554)
at
org.eclipse.emf.ecore.impl.EcoreFactoryImpl.createEIntegerObjectFromString(EcoreFactoryImpl.java:519)
I debugged the code, the first sync is from model to control, right! New
created GeneralStatement contains a field 'timeout' with null as its
value, internal ObjectToString converter converted null to "", so text
control display a blank, but the second round is from control to model,
framework found the target type is Integer, and try to convert "" to int
via Integer.parseInt(String).
On 2012/5/23 15:41, Tom Schindl wrote:
> The first sync should always go from model to control. Can you show us
> how you've set up the binding? My current suspicion is that you mixed
> mixed the arguments.
>
> You could naturally also add your custom converter by using passing an
> UpdateStrategy object when doing the bind.
>
> Tom
>
> Am 23.05.12 09:17, schrieb David BY Chan:
>> Hi, I created a data binding between a SWT control and a Bean property,
>> assume there's a control named 'textAge' and a Bean class Person has a
>> field named 'age' whose type is int.
>>
>> Now I bind them, binding framework first get value from textAge control,
>> it will get a empty string if user didn't input anything because
>> attribute 'age' is not required. But framework don't think so, it still
>> invoke converter to transform value between control and model. It
>> eventually called Integer.parseInt(value) and throwed a Exception
>> java.lang.NumberFormatException: For input string: ""
>>
>> what I want is If framework found an EMPTY (null or length=0) string, it
>> give a waring and don't process further.
>>
>> How to do? thank for your great help!!
>
|
|
|
Re: [data binding] how to make a binding be optional? [message #875740 is a reply to message #875726] |
Wed, 23 May 2012 08:59 |
Thomas Schindl Messages: 6651 Registered: July 2009 |
Senior Member |
|
|
The only solution I have for you at the moment is that you pass your
custom converter to the UpdateStrategy which handles the empty string
case and converts it to NULL.
The default conversion leverages EMFs internal conversion support which
works the way it works at the moment. You can naturally file a bugzilla
for EMF-Databinding to treat the "" case but I can't promise if and when
I'll have time to implement it.
Tom
Am 23.05.12 10:30, schrieb David BY Chan:
> No, I did not mix the arguments. Here's my example:
>
> EMF Model:
> public interface GeneralStatement{
> Integer getTimeout();
> void setTimeout(Integer value);
> }
>
> Binding:
>
> IObservableValue ob_txt_timeout =
> SWTObservables.observeText(textTimeout,SWT.Modify);
> IObservableValue ob_model_timeout =
> EMFObservables.observeValue(stmt,
> stmt.eClass().getEStructuralFeature(Mapperv2Package.GENERAL_STATEMENT__TIMEOUT));
>
> timeoutBinding =
> current_binding_context.bindValue(ob_txt_timeout, ob_model_timeout);
>
> I didn't use any converter because framework defined internal
> StringToInteger conveter.
>
> Exception:
> java.lang.NumberFormatException: For input string: ""
> at
> java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
>
> at java.lang.Integer.parseInt(Integer.java:470)
> at java.lang.Integer.valueOf(Integer.java:554)
> at
> org.eclipse.emf.ecore.impl.EcoreFactoryImpl.createEIntegerObjectFromString(EcoreFactoryImpl.java:519)
>
>
> I debugged the code, the first sync is from model to control, right! New
> created GeneralStatement contains a field 'timeout' with null as its
> value, internal ObjectToString converter converted null to "", so text
> control display a blank, but the second round is from control to model,
> framework found the target type is Integer, and try to convert "" to int
> via Integer.parseInt(String).
>
> On 2012/5/23 15:41, Tom Schindl wrote:
>> The first sync should always go from model to control. Can you show us
>> how you've set up the binding? My current suspicion is that you mixed
>> mixed the arguments.
>>
>> You could naturally also add your custom converter by using passing an
>> UpdateStrategy object when doing the bind.
>>
>> Tom
>>
>> Am 23.05.12 09:17, schrieb David BY Chan:
>>> Hi, I created a data binding between a SWT control and a Bean property,
>>> assume there's a control named 'textAge' and a Bean class Person has a
>>> field named 'age' whose type is int.
>>>
>>> Now I bind them, binding framework first get value from textAge control,
>>> it will get a empty string if user didn't input anything because
>>> attribute 'age' is not required. But framework don't think so, it still
>>> invoke converter to transform value between control and model. It
>>> eventually called Integer.parseInt(value) and throwed a Exception
>>> java.lang.NumberFormatException: For input string: ""
>>>
>>> what I want is If framework found an EMPTY (null or length=0) string, it
>>> give a waring and don't process further.
>>>
>>> How to do? thank for your great help!!
>>
>
|
|
|
Goto Forum:
Current Time: Thu Sep 26 08:23:05 GMT 2024
Powered by FUDForum. Page generated in 2.68282 seconds
|