In the older versions of flex, we can make use of the 'Bindable' tag to reduce the amount of coding required. However, once we give users the ability to change a value of a component that was previous bind to a value, that's where all the extra coding comes in. Therefore in the newer version of flex, we have the privilege to do 2 way binding, which is pretty helpful. Anyway let's take a look at the codes of the simple demo that I have created.
Source Code for the main application - 'Simple2WayBinding.mxml'<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
backgroundColor="#CDCDCD"
creationComplete="creationCompleteEvent(event)" xmlns:zcs="com.zcs.*">
<fx:Declarations>
<zcs:OppositeBooleanObj id="oppObj"/>
<zcs:OppositeBooleanObj id="oppObj1"/>
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.binding.utils.BindingUtils;
import mx.events.FlexEvent;
protected function creationCompleteEvent(event:FlexEvent):void
{
//We are creating a 2-way binding using the following liners.
//As you can see, the selected value of the following
//checkboxes, 'chk1' and 'chk4' will be bind 2-ways.
BindingUtils.bindProperty(chk1, "selected", chk4, "selected");
BindingUtils.bindProperty(chk4, "selected", chk1, "selected");
}
]]>
</fx:Script>
<fx:Binding twoWay="true"
source="chk1.selected"
destination="chk2.selected"/>
<s:VGroup width="100%"
height="100%"
verticalAlign="middle"
horizontalAlign="center">
<s:Spacer height="100%"/>
<s:HGroup verticalAlign="middle"
horizontalAlign="center"
width="100%">
<s:TextArea borderVisible="false"
contentBackgroundAlpha="0"
textAlign="center"
width="100%" height="20">
This is using <fx:Binding> to bind the
values of the properties together.
</s:TextArea>
</s:HGroup>
<s:HGroup verticalAlign="middle"
horizontalAlign="center"
width="100%">
<s:CheckBox label="This is (1)."
id="chk1"/>
</s:HGroup>
<s:HGroup verticalAlign="middle"
horizontalAlign="center"
width="100%">
<s:CheckBox label="This will always have the same value as (1)."
id="chk2"/>
</s:HGroup>
<s:Spacer height="100%"/>
<s:HGroup verticalAlign="middle"
horizontalAlign="center"
width="100%">
<s:TextArea borderVisible="false"
contentBackgroundAlpha="0"
textAlign="center"
width="100%" height="20">
This is using a '@' symbol before the curly brackets
to bind the values of the properties to a object.
</s:TextArea>
</s:HGroup>
<s:HGroup verticalAlign="middle"
horizontalAlign="center"
width="100%">
<s:CheckBox label="This is (2)."
selected="@{oppObj.value1}"/>
</s:HGroup>
<s:HGroup verticalAlign="middle"
horizontalAlign="center"
width="100%">
<s:CheckBox label="This will always have a different value as (2)."
selected="@{oppObj.value2}"/>
</s:HGroup>
<s:Spacer height="100%"/>
<s:HGroup verticalAlign="middle"
horizontalAlign="center"
width="100%">
<s:TextArea borderVisible="false"
contentBackgroundAlpha="0"
textAlign="center"
width="100%" height="20">
This is using 'BindingUtils' to bind the value of the
property of this check box to '(1)'.
</s:TextArea>
</s:HGroup>
<s:HGroup verticalAlign="middle"
horizontalAlign="center"
width="100%">
<s:CheckBox label="This will always have the same value as (1)."
id="chk4"/>
</s:HGroup>
<s:Spacer height="100%"/>
</s:VGroup>
</s:Application>Source Code for the simple Object used in this demo - 'OppositeBooleanObj.as'
package com.zcs
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
public class OppositeBooleanObj extends EventDispatcher
{
private var _value1:Boolean = true;
private var _value2:Boolean = false;
[Bindable(event="value1Changed")]
public function get value1():Boolean
{
return _value1;
}
//change the value of 'value2' when 'value1' changes
//We are dispatching the event 'value2Changed' to
//trigger data binding.
public function set value1(value:Boolean):void
{
_value1 = value;
_value2 = !_value1;
dispatchEvent(new Event("value2Changed"));
}
[Bindable(event="value2Changed")]
public function get value2():Boolean
{
return _value2;
}
//change the value of 'value1' when 'value2' changes
//We are dispatching the event 'value1Changed' to
//trigger data binding.
public function set value2(value:Boolean):void
{
_value2 = value;
_value1 = !_value2;
dispatchEvent(new Event("value1Changed"));
}
}
}
* Click here for the demo shown in this post.^ Click here for the source files for the demo.
No comments:
Post a Comment