У меня есть пользовательский компонент Flex 4+, который я пытаюсь сделать, и чтобы скин знал об изменениях в настраиваемом свойстве. Это свойство будет определять графику на кнопке (и некоторые другие визуальные изменения), но данные будут постоянно меняться, поскольку они будут обновляться таймером.Flex 4 Custom Component - Как уведомить скин об изменениях свойств?
Я рассмотрел невыразимые примеры и по-прежнему кажется неспособным получить синтаксис правильно или обнаружить, как вещи должны быть разделены. Я смотрел на отмену commitProperties и PropertyChangeEvent без успеха. Поэтому у меня есть два вопроса.
1) Как я могу получить скин, который будет уведомлен об связанном имуществе, когда он изменится?
2) Если данные для связанного свойства компонента являются объектами, они будут работать надлежащим образом, если свойство объекта изменится (или было бы лучше передать каждое свойство отдельно)?
Вот урезанный пример того, чего я пытаюсь достичь.
компонент выглядит следующим образом:
<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>
Я звоню это так:
<components:MyButton id="myButton" iconData="{myData.curIconTag}" skinClass="skins.MyButtonSkin" />
У меня есть много различных изображений, которые я мог бы быть погрузочных и поэтому я Я боюсь, что количество состояний (с комбинациями вверх/вниз/выше/отключено и т. д. может выйти из-под контроля, поэтому SetIconDisplay устанавливает значок, но реальный ключ заключается в том, что у меня есть другой код в этой функции который должен выполняться, когда свойство iconData изменяется каждые X минут или около того. Таким образом, кожа что-то вроде этого:
<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"/>
Опять же, не волнуйтесь так много о том, как кожа на самом деле делает то, что он делает, как, вероятно, изменится (не используя состояния). Я просто пытаюсь выяснить, как вызвать определенную функцию при изменении свойства bound.
Спасибо!
Посмотрите на код SparkSkin, и вы увидите, что hostComponent не является частью SparkSkin. Я считаю, что свойство создается во время компиляции на основе метаданных компонента хоста. Это имеет смысл, потому что все оболочки MXML расширяют SparkSkin и этот скин не имеет возможности узнать, что должен быть тип аргумента свойства hostComponent. На скине ActionScript вы должны вручную создать свойство hostComponent. – JeffryHouser