2009-02-09 16 views
23

Co staram się osiągnąć, aby dane finansowe w moim Flex Datagrid były kodowane kolorami - zielone, jeśli są pozytywne; czerwony, jeśli jest ujemny. Byłoby to dość proste, gdyby kolumna, którą chcę kolorować była częścią dataProvider. Zamiast tego, obliczam to na podstawie dwóch innych kolumn, które są częścią dataProvider. Byłoby to dość proste, ponieważ mógłbym to obliczyć ponownie w ItemRenderer, ale inna część obliczeń opiera się na wartości textBox. Tak, więc myślę, że muszę być w stanie wysyłać wartość textBox do niestandardowego ItemRenderer, ale ponieważ wartość ta jest przechowywana w głównej aplikacji MXML, nie wiem, jak uzyskać do niego dostęp. Wysłanie go jako parametru wydaje się najlepszym sposobem, ale może jest inny.Flex - Wysyłanie parametru do niestandardowego obiektu ItemRenderer?

Oto aktualny kod dla mojego itemRenderer:

package { 
import mx.controls.Label; 
import mx.controls.listClasses.*; 

public class PriceLabel extends Label { 
    private const POSITIVE_COLOR:uint = 0x458B00 // Green 
    private const NEGATIVE_COLOR:uint = 0xFF0000; // Red 

    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { 
     super.updateDisplayList(unscaledWidth, unscaledHeight); 

     /* Set the font color based on the item price. */ 
     setStyle("color", (data.AvailableFunding >= 0) ? NEGATIVE_COLOR : POSITIVE_COLOR); 
    } 
} 

(data.AvailableFunding nie istnieje)

Więc czy ktoś wie jak pójdę o realizacji tego?

Odpowiedz

35

Możesz zajrzeć do ClassFactory z API Flex:

ta pozwala na ustawienie obiektu prototypu z dowolnych typów/wartości, z których każda zostanie przekazany do renderowania elementu. Z próbki:

var productRenderer:ClassFactory = new ClassFactory(ProductRenderer); 
productRenderer.properties = { showProductImage: true }; 
myList.itemRenderer = productRenderer; 

Powyższy kod zakłada, że ​​„ProductRenderer” ma własność publiczną o nazwie „showProductImage”, które zostaną ustawione wartości „true”.

+4

Znacznie lepszą odpowiedź niż wybrany! Dodaj jedną obsługę zdarzeń, napisz trzy linie kodu ... ZROBIONY! –

+1

możesz podać przykład, jak to osiągnąć?Mam element listy i elementndnderer i chcę przekazać dodatkową wartość do elementu, który wydał przedmiot, w jaki sposób mogę to zrobić? – sstauross

+1

Bardzo elegancki i cuda działa. Właściwości klarowności muszą być zdefiniowane w renderowaniu (w fx: Deklaracja na przykład). – MonoThreaded

1

Ah, więc wiedziałem o outerDocument, ale nie ParentDocument. Byłem w stanie użyć parentDocument. * Cokolwiek chcę z głównej aplikacji i mogę uzyskać do niego dostęp, o ile jest to publiczne.

Przykład:

setStyle("color", (parentDocument.availableFunding >= 0) ? POSITIVE_COLOR : NEGATIVE_COLOR); 

słodkie! :)

+0

Użycie parentDocument spowoduje sprzężenie renderer produktu z komponentem nadrzędnym i sprawi, że stanie się bezużyteczny nigdzie indziej w aplikacji. Uważnie śledzić, jest to zwykle uważane za złą praktykę. –

1

Możesz uzyskać dostęp do wartości TextBox bezpośrednio, jeśli potrzebujesz, za pomocą statycznego obiektu Application.application, który jest dostępny z dowolnego miejsca w aplikacji.

Na przykład, jeśli chcesz, aby renderery były powiadamiane, gdy zmieni się wartość formantu TextInput, możesz zrobić coś takiego (z poziomu ItemRenderer i gdzie myTextInput jest identyfikatorem kontrolki zdefiniowanej w głównym MXML klasa):

<mx:Script> 
    <![CDATA[ 

     import mx.core.Application; 

     private function creationCompleteHandler(event:Event):void 
     { 
      Application.application.myTextInput.addEventListener(TextEvent.TEXT_INPUT, handleTextInput, false, 0, true); 
     } 

     private function handleTextInput(event:TextEvent):void 
     { 
      if (event.currentTarget.text == "some special value") 
      { 
       // Take some action... 
      } 
     } 

    ]]> 
</mx:Script> 

Dzięki takiemu podejściu każdy obiekt item-renderujący zostanie powiadomiony, gdy tekst zmienia własność textInput, a można podjąć odpowiednie działania w oparciu o wartości kontroli w tym czasie. Zauważ również, że ustawiłem argument useWeakReference na true w tym przypadku, aby upewnić się, że przypisania odbiornika nie będą w sposób niezamierzony wpływać na odśmiecanie. Mam nadzieję, że to pomoże!

0

chciałbym zastąpić funkcję zbioru danych renderującego elementu zmienić renderujący gdy zmienia dostawcę danych, jak pokazano here

Kiedy zastąpić funkcję można oddania obiektu do obiektu, aby dostępna dostępna właściwośćFunding.

Aby uzyskać dostęp do pola tekstowego można spróbować tworząc własność publiczną i wiążące właściwość do pola tekstowego w pliku mxml:

public var textVar:String; 

      <mx:itemRenderer> 
       <mx:Component> 
        <customrenderer textVar="{txtBox.text}" /> 
       </mx:Component> 
      </mx:itemRenderer> 
+0

To nie zadziała. Deklarowany mx: Component jest poza zakresem, w którym txtBox.text żyje. – Nek

0

Jest inna technika, która, podczas gdy początkowo wydaje się, że trochę hacky jest być może mniej kłopotliwym i czystszym w użyciu.

Obejmuje to mało zauważony fakt, że ekspedycja zdarzenia jest oczywiście synchroniczna, a obiekt zdarzenia może być traktowany jako obiekt wartości zapełniony przez dowolną procedurę obsługi zdarzeń.

czyli itemRenderer może zrobić coś takiego:

... 
    var questionEvt:DynamicEvent = new DynamicEvent('answerMeThis', true, true); 
    if (dispatchEvent(questionEvt)) 
    { 
     if (questionEvent.answer == "some value") 
     .... 

z odpowiednim obsługi gdzieś w górę hierarchii widok powyżej mechanizm renderujący, który ma słuchacza na imprezy i robi coś takiego:

function handleAnswerMeThis(event:DynamicEvent):void 
{ 
    event.answer = "another value"; 
    event.dataHelper = new DataHelperThingy(); 
} 

itp.

Nie musi to być DynamicEvent - używam go tylko do leniwych celów ilustracyjnych.

0

Głosuję za cliff.meyers' answer.

Oto kolejny przykład na temat ustawiania właściwości itemRenderer z MXML przez zbudowanie funkcji, która opakowuje klasę ClassFactory wokół klasy itemRenderer i która wstrzykuje wymagane właściwości.

Statyczna funkcja:

public static function createRendererWithProperties(renderer:Class, 
properties:Object):IFactory { 
    var factory:ClassFactory = new ClassFactory(renderer); 
    factory.properties = properties; 
    return factory; 
} 

Prostym przykładem, który dodaje podpowiedź do każdej pozycji na liście:

<mx:List dataProvider="{['Foo', 'Bar']}" itemRenderer="{createRendererWithProperties(Label, {toolTip: 'Hello'})}"/> 

referencyjny:
http://cookbooks.adobe.com/post_Setting_the_properties_of_an_itemRenderer_from_MXM-5762.html

+0

Wymieniłem odpowiedzi. :) –

0

Można utworzyć zmienną statyczną "AvailableFunding" w ItemRenderer, a następnie ustawić ją w dokumencie nadrzędnym.

public class PriceLabel extends Label { 
    public static var availableFunding:int; 
    ... 
    ... 
    SetStyle("color", (PriceLabel.availableFunding >= 0) ? NEGATIVE_COLOR : POSITIVE_COLOR); 
} 

W dokumencie nadrzędnej, ustaw go, gdy pole tekstowe jest aktualizowany

PriceLabel.availableFunding = textBox.text; 

Oczywiście będzie to ta sama wartość dla każdego itemRenderer ale wygląda na to, że może być to, co robisz tak czy inaczej.

0

Zobacz ten przykład:

itemRenderer = "{UIUtils.createRenderer (TextBox {iconSrc: IconRepository.linechart, headerColor: 0xB7D034, subHeaderColor: 0xE3007F, textColor: 0x75757D})}"

Powiązane problemy