有一种常见的情况是我将数据模型值绑定到GUI控件,比如TextInput。数据模型从后端检索。
如果用户更改了TextInput的值,则单击“刷新”按钮再次从后端检索数据模型,GUI值不会更改回来。重新绑定不会发生,因为数据模型的值没有改变,所以没有触发propertyChanged事件。
在这种情况下,我必须在数据刷新完成后以编程方式将模型值设置为GUI。
我知道双向绑定可以解决这个问题(当用户在GUI上更改值时,立即将新值设置为数据模型)。但有时候我不能使用双向绑定,例如,数据模型是一个int,但是用户输入一个非int值,我无法将值设置为数据模型。所以数据模型中的值不会改变,刷新数据时,重新绑定仍然没有发生。
这会使数据绑定无用。如何解决这个问题?
我现在把伪代码放在这里,我稍后会把真正的代码放进去:
1. retrieve a data model from server, via blazeds or something else.
2. bind the model to a TextInput on GUI.
3. user change the TextInput text.
4. User click a refresh button, triger retrieve the model value again.
5. Now since the model value do not change, no PropertyChanged event fired.
6. GUI value still is the user's input, not the value from the model.
我可以在设置velue之前清除模型值,重新绑定发生。(但有时你不知道如何清理模型值,以int为例,你可能不知道原始值并发生设置相同的值)。或者我可以手动将模型值设置为GUI。但两者都不好看。 双向绑定不起作用,因为如果用户输入无效值,我无法将其设置为模型。模型值不会改变,重新绑定不会发生。
答案 0 :(得分:2)
双向绑定可以通过多种方式实现,不一定是@ -symbol。在您的特定情况下,您需要使用Binding-tag:
<fx:Binding source="parseInt(someNumberInput.text)"
destination="someModel.someNumberValue"/>
<s:TextInput id="someNumberInput" text="{someModel.someNumberValue}"/>
非常重要的是不要忘记parseInt()
数值。
答案 1 :(得分:1)
您可以随时调度绑定事件。一种方法是简单地在要更新的所有属性上调度PropertyChangeEvent,但另一种方法是在标准绑定之外添加自己的绑定事件。
例如,我认为这样可行:
[Bindable]
[Bindable (event="allChanged")]//make sure to dispatch this yourself when everything changes
public var myInt:int;
自定义绑定事件有可能阻止Flex在后台生成执行标准绑定的代码(我从未做过上述操作,因为如果我要使用自定义事件,我倾向于不使用标准绑定)。
Flash Builder 4.5具有出色的代码生成功能,因此您只需将公共变量转换为getter和setter,它就会询问您是否要为该属性触发自定义事件。如果您选中该框,它将为您编写代码。然后手动添加第二个元数据标签。
getter / setter方法的性能会更好,因为每个属性都有自己的事件,而不是所有属性都在propertyChange上触发并检查属性是否正确。但另一个如果有效则不那么冗长和易于维护。
答案 2 :(得分:0)
使用相关编辑器编辑数值。 Flex无法猜测你想做什么。