apache-flex 如何根据模型标志更改自动更新itemRenderer状态

j5fpnvbx  于 2022-11-01  发布在  Apache
关注(0)|答案(1)|浏览(136)

我有一个ItemRenderer,其中的数据有一些标志。我需要根据这些标志更改ItemRenderer的颜色。我该如何实现这一点?这是我的IR:

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" 
            xmlns:mx="library://ns.adobe.com/flex/mx" 
            autoDrawBackground="false"
            x="{data.x}" y="{data.y}">

<s:states>
    <s:State name="node"/>
    <s:State name="nodeIn"/>
    <s:State name="nodeOut"/>
    <s:State name="nodeTrafficLight"/>
    <s:State name="nodeIntersection"/>
    <s:State name="nodeBlocked"/>
</s:states>

<s:Ellipse width="16" height="16" x="-8" y="-8">
    <s:stroke>
        <s:SolidColorStroke weight="2"
                            color="#FFFF00"
                            color.nodeTrafficLight="#FF00FF"
                            color.nodeIntersection="#FF9900"
                            color.nodeBlocked="#000000"
                            color.nodeIn="#00FF00"
                            color.nodeOut="#FF0000"/>
    </s:stroke>
    <s:fill>
        <s:SolidColor alpha=".5"
                      color="#FFFF00"
                      color.nodeTrafficLight="#FF00FF"
                      color.nodeIntersection="#FF9900"
                      color.nodeBlocked="#000000"
                      color.nodeIn="#00FF00"
                      color.nodeOut="#FF0000"/>
    </s:fill>
</s:Ellipse>

<fx:Script>
    <![CDATA[
        override protected function getCurrentRendererState():String
        {
            if (data.isBlocked)
                return "nodeBlocked";

            if (data.isIn)
                return "nodeIn";

            if (data.isOut)
                return "nodeOut";

            if (data.isIntersection)
                return "nodeIntersection";

            return "node";
        }
    ]]>
</fx:Script>
</s:ItemRenderer>

但是当这些标记(例如data.isIn)改变时,我没有得到这些状态的更新。我的模型有[Bindable]标记。

mo49yndu

mo49yndu1#

首先,我不认为x和y值对渲染器内部有影响。list类将处理渲染器的定位。
也就是说,呈现器不响应dataChange事件;这样渲染器在数据更改时不会自我更新。添加dataChange事件处理程序:

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" 
            xmlns:mx="library://ns.adobe.com/flex/mx" 
            autoDrawBackground="false"
            dataChange="onDataChange(event)">

<fx:Script>
    <![CDATA[
      protected function onDataChange(event:Event):void{
          invalidateRendererState();
      }
    ]]>
</fx:Script>

invalidateRendererState()方法应强制commitProperties()重新运行;这又将强制执行getCurrentRendererState()。
如果由于某种原因,当您更改dataProvider中的数据时,onDataChange()事件没有触发;您必须在dataProvider上使用itemUpdated()或refresh()函数来“宣布”您更改了数据。

相关问题