Доступ к пользовательскому свойству hostComponent при создании скина — Flex 4.5, SDK 4.5

Используя SDK 4.1, я смог получить доступ к пользовательским свойствам компонента пользовательской кнопки из пользовательского скина. Проект, над которым я сейчас работаю, требует SDK 4.5, и я не могу получить доступ к свойствам. Вот пример:

Компонент пользовательской кнопки

<?xml version="1.0" encoding="utf-8"?>
<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"
          skinClass="components.skins.ButtonIcon_Skin"
          >
    <fx:Declarations>
        <fx:String id="iconCustom" />
    </fx:Declarations>
</s:ButtonBase>

Пользовательский скин кнопки

<?xml version="1.0" encoding="utf-8"?>
<s:SparkButtonSkin xmlns:fx="http://ns.adobe.com/mxml/2009" 
             xmlns:s="library://ns.adobe.com/flex/spark" 
             xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
             minWidth="21" minHeight="21" 
             alpha.disabled="0.5">
    <fx:Metadata>[HostComponent("components.ButtonIcon")]</fx:Metadata>

...

    <s:Label id="test" {hostComponent.iconCustom}" 
             horizontalCenter="0" bottom="10" />

</s:SparkButtonSkin>

Подсказка кода показывает hostComponent.iconCustom, но затем выдает ошибку:

Access of possibly undefined property iconCustom through a reference with static type spark.components.supportClasses:ButtonBase. ButtonIcon_Skin.mxml

person Trist    schedule 07.06.2011    source источник


Ответы (2)


Просто замените этот SparkButtonSkin на обычный скин, и все будет в порядке:

<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark">

    <fx:Metadata>
        [HostComponent("components.ButtonIcon")]
    </fx:Metadata>

    <s:states>
        <s:State name="disabled" />
        <s:State name="down" />
        <s:State name="over" />
        <s:State name="up" />
    </s:states>

    <s:Label text="test {hostComponent.iconCustom}" 
             horizontalCenter="0" bottom="10" />

</s:Skin>
person RIAstar    schedule 07.06.2011
comment
ты бриллиант. Сработало удовольствие. - person Trist; 08.06.2011
comment
Использование <s:SparkSkin/> также устранило ошибки компиляции. Однако я обнаружил, что оба решения не отображают изображение, которое я установил на панели кнопок (в то время как <s:SparkButtonSkin/> сохраняет это изображение. Не знаю, почему). - person ggkmath; 26.07.2013
comment
Почему? Здесь нет почему. Что, если мне понадобится SparkButtonSkin или что-то в этом роде? Можем ли мы получить больше разъяснений? Я знаю, что ответ устарел, но это то, чем мы здесь занимаемся, не так ли? - person deltree; 08.06.2016
comment
@deltree Я не занимался разработкой Flex уже много лет, поэтому боюсь, что больше не смогу указать вам точную причину. Я предполагаю, что это должно быть какая-то проблема наследования в иерархии классов скинов. - person RIAstar; 26.08.2016
comment
@ggkmath весь смысл создания пользовательского скина заключается в повторной реализации визуального аспекта. Вы просто добавляете туда изображение, которое привязывается к iconCustom, и все готово. Если ваша цель — просто немного изменить стиль исходных скинов Spark, вместо этого вам следует использовать CSS. - person RIAstar; 26.08.2016

Другой вариант, если вы хотите использовать SparkButtonSkin, просто приведите его к вашему фактическому хост-компоненту.

(hostComponent as ButtonIcon).iconCustom

или в контексте:

Пользовательский скин кнопки

<?xml version="1.0" encoding="utf-8"?>
<s:SparkButtonSkin xmlns:fx="http://ns.adobe.com/mxml/2009" 
             xmlns:s="library://ns.adobe.com/flex/spark" 
             xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
             minWidth="21" minHeight="21" 
             alpha.disabled="0.5">
    <fx:Metadata>[HostComponent("components.ButtonIcon")]</fx:Metadata>

...

    <s:Label id="{(hostComponent as ButtonIcon).iconCustom}" 
             horizontalCenter="0" bottom="10" />

</s:SparkButtonSkin>
person Tommy    schedule 26.07.2011
comment
Если я добавлю это приведение, ошибка компиляции исчезнет, ​​но будет заменена предупреждением, что привязка данных не сможет обнаружить назначения для hostComponent. Я могу работать с этим предупреждением, но значения, которые я получаю из свойств hostComponent, недействительны. - person Tony; 25.05.2012
comment
Большое спасибо за ваш ответ, Томми. RIAstar у меня не работал, так как мне требовалось, чтобы SparkButtonSkin каким-то образом отображал изображения. Ваш ответ сработал. - person ggkmath; 26.07.2013