Ho un componente Flex 4+ personalizzato che sto cercando di fare e che la pelle sia a conoscenza delle modifiche a una proprietà personalizzata. Questa proprietà determinerà il grafico sul pulsante (e alcune altre modifiche visive) ma i dati cambieranno costantemente in quanto verrà aggiornato da un timer.Flex 4 Componente personalizzato - Come notificare la pelle delle modifiche alle proprietà?
Ho esaminato esempi indicibili e mi sembra ancora impossibile ottenere la sintassi corretta o scoprire come le cose dovrebbero essere separate. Ho esaminato l'override di commitProperties e PropertyChangeEvent senza successo. Quindi ho due domande.
1) Come è possibile ottenere una notifica di una proprietà associata quando cambia?
2) Se i dati per una proprietà associata del componente è un oggetto, il binding funzionerà correttamente se una proprietà dell'oggetto cambia (o sarebbe meglio passare ciascuna proprietà separatamente)?
Ecco un esempio ridotto di ciò che sto cercando di ottenere.
Il componente si presenta così:
<s:ButtonBase xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
private var _iconData:String;
[Bindable]
public function get iconData():String
{
return _iconData;
}
public function set iconData(value:String):void
{
_iconData = value;
}
]]>
</fx:Script>
sto chiamando in questo modo:
<components:MyButton id="myButton" iconData="{myData.curIconTag}" skinClass="skins.MyButtonSkin" />
Ho un sacco di immagini diverse che potrei essere di carico e così ho temo che il numero di stati (con le combinazioni di su/giù/sopra/disabilitato, ecc. possa sfuggire di mano così il SetIconDisplay sta impostando l'icona, ma la vera chiave è che ho un altro codice in quella funzione che deve essere eseguito quando la proprietà iconData cambia ogni X minuti o così. Così la pelle è qualcosa di simile:
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
creationComplete="init()">
<fx:Metadata>
[HostComponent("components.MyButton")]
</fx:Metadata>
<s:states>
<s:State name="default" />
<s:State name="down"/>
<s:State name="up"/>
<s:State name="over"/>
<s:State name="disabled" />
</s:states>
<fx:Script>
<![CDATA[
import components.MyButton;
[Embed(source="images/image1.png")]
private var icon1:Class;
[Embed(source="images/image2.png")]
private var icon2:Class;
[Embed(source="images/image3.png")]
private var icon3:Class;
[Bindable]
public var hostComponent:MyButton;
[Bindable]
private var iconClass:Class;
private function init():void
{
iconClass = new Class();
}
// how do I get this called when the iconData property on my custom component is changed?
private function SetIconDisplay():void
{
switch (hostComponent.iconData)
{
case "apple":
iconClass=icon1;
break;
case "orange":
iconClass=icon2;
break;
case "grape":
iconClass=icon3;
break;
}
}
]]>
</fx:Script>
<s:BitmapImage source="{iconClass}" x="0" y="0" width="180" height="108"/>
Anche in questo caso, non si preoccupi tanto di come la pelle è in realtà facendo quello che sta facendo come che probabilmente cambierà (se non utilizzano gli stati). Sto solo cercando di capire come chiamare una funzione specifica quando la proprietà associata viene modificata.
Grazie!
Date un'occhiata al codice SparkSkin e vi accorgerete che hostComponent non fa parte del SparkSkin. Credo che la proprietà venga creata in fase di compilazione in base ai metadati del componente host. Questo ha senso perché tutti gli skin MXML estendono SparkSkin e quella skin non ha modo di sapere quale dovrebbe essere il tipo di argomento proprietà di hostComponent. In una skin solo ActionScript è necessario creare manualmente la proprietà hostComponent. – JeffryHouser