Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-02-2012, 14:13   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 29
PropertyChanged-Event wird nicht ausgelöst

Hallo,

Ich habe in meiner Model-Klasse viele Daten-Properties, welche alle Bindable sind. Die meisten davon haben getter und setter und sind mit [Bindable] deklariert. Bei diesen Properties funktioniert auch alles. Einige Properties, welche von anderen Werten abhängen, haben jedoch nur einen getter:
Code:
[Bindable("shapeChanged")]
public function get shape():String
{
	return ...;
}
Wenn sich dieses Property dann ändert gebe ich das über folgenden Code bekannt:
Code:
dispatchEvent(new PropertyChangeEvent("shapeChanged",
	false, false, PropertyChangeEventKind.UPDATE, 
	"shape", null, shape, this));
Wenn ich in MXML ein Binding auf ein soches Property mache aktualisiert sich die GUI automatisch. Wenn ich jedoch ein PropertyChangedEvent im Code auf ein Objekt registriere bekomme ich nur die Eigenschaftsänderungen mit bei denen es getter UND setter gibt. Die Variante in dem Beispielcode feuert hier kein Event. Was mache ich falsch?
Lector ist offline   Mit Zitat antworten
Alt 13-02-2012, 15:04   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Die ganze Klasse oder zumindest mehr Code bitte.
Omega Psi ist offline   Mit Zitat antworten
Alt 13-02-2012, 15:54   #3 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 29
Alles kann ich leider nicht posten da dies den Rahmen sprengen würde (~1000 Zeilen)
Hier ein relevanter Ausschnitt aus der Datenklasse:
Code:
public class ImageItem extends ItemBase implements IShaped //Leitet indirekt von EventDispatcher ab
{
        private var _imageShape:ImageShape;

	[Bindable]
	public function get imageShape():ImageShape
	{
		return _imageShape;
	}
	public function set imageShape(value:ImageShape):void
	{
		if(imageShape != null)
		{
			imageShape.removeEventListener(PropertyChangeEvent.PROPERTY_CHANGE, imageShape_PropertyChanged);
		}
		_imageShape = value;
		if(imageShape != null)
		{
			imageShape.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, imageShape_PropertyChanged);
		}
		notifyShapeChanged();
	}
	
	[Bindable("shapeChanged")]
	public function get shape():String
	{
		return _imageShape.normalizedPathData;
	}
	
	private function notifyShapeChanged():void
	{
		dispatchEvent(new PropertyChangeEvent("shapeChanged",
			false, false, PropertyChangeEventKind.UPDATE, 
			"shape", null, shape, this));
	}
	private function imageShape_PropertyChanged(e:PropertyChangeEvent):void
	{
		if(e.property == "normalizedPathData")
			notifyShapeChanged();
	}
}
Nun würde ich von ausserhalb dieser Klasse gerne mitbekommen wenn sich die Eigenschaft 'shape' ändert. Dadurch dass ich in der Funktion notifyShapeChanged dispatchEvent aufrufe sollte dies ja eigendlich kein Problem sein. Wenn in im MXML ein Binding auf diese Eigenschaft mache aktualisiert sich auch alles richtig. Folgender Code scheint aber nicht zu funktionieren:

Code:
private var _shaped:IShaped; //Es handelt sich im Beispielszenario um ein ImageItem

private function register():void
{
	_shaped.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, shaped_PropertyChanged);
}

private function shaped_PropertyChanged(e:PropertyChangeEvent):void
{
	trace(e.property);
}
Wenn ich mein Programm laufen lasse und sich der Shape ändert sehe ich in der Ausgabe dass sich 'imageShape' ändert. Von der Eigenschaft 'shape' fehlt allerdings jede Spur. Die notifyShapeChanged-Methode wird ausgeführt. Das habe ich im Debugger überprüft. Außerdem habe ich in der GUI Bindings an diese Eigenschaft gemacht und dort funktioniert auch alles. Es befinden sich in der ImageItem-Klasse noch mehrere Eigenschaften bei denen nicht das Standard-[Bindable] angegeben ist sondern die ausführliche Variante ohne Setter mit manuellen dispatchEvent. Bei all diesen Eigenschaften scheine ich über den Beispielcode weiter oben keine Änderung mitzubekommen obwohl die MXML-GUI keine Probleme damit hat. Ich hoffe dass mein Problem durch den Beispielcode jetzt ersichtlich ist. Was mache ich falsch?
Lector ist offline   Mit Zitat antworten
Alt 13-02-2012, 16:01   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Eventhandler die an imageShape gebunden werden, hören nur auf PropertyChangeEvent.PROPERTY_CHANGE. Dich interessiert aber denke ich ja shapeChanged. Das bedeutet eine Anpassung á la
Code:
[Bindable("shapeChanged")]
public function get imageShape():ImageShape
{
  return _imageShape;
}
sollte es für den Fall tun.
Omega Psi ist offline   Mit Zitat antworten
Alt 13-02-2012, 16:14   #5 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 29
Aber die Eigenschaft 'imageShape' kann ich doch ohne Probleme per PropertyChangeEvent überwachen. Das Problem tritt bei der Eigenschaft 'shape' auf bei der das PropertyChangeEvent nicht zu funktionieren scheint.
Lector ist offline   Mit Zitat antworten
Alt 14-02-2012, 09:54   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Ich hab mal ein einfaches Beispiel zusammen geschraubt.
Code:
package net.icodeapps.examples.model
{
  import flash.events.Event;
  import flash.events.EventDispatcher;

  public class Person extends EventDispatcher
  {
    //---------------------------------------------------------------------
    //
    //          Properties
    //
    //---------------------------------------------------------------------

    //-----------------------------
    //          firstName
    //-----------------------------

    private var _firstName:String;

    [Bindable('firstNameChange')]
    public function get firstName():String
    {
      return _firstName;
    }

    public function set firstName(value:String):void
    {
      if (_firstName == value)
      {
        return
      }
      _firstName = value  || '';
      invalidateFullName();
      dispatchEvent(new Event('firstNameChange'));
    }

    //-----------------------------
    //          fullName
    //-----------------------------

    [Bindable('fullNameChanged')]
    public function get fullName():String
    {
      return _firstName + ' ' + _lastName
    }

    //-----------------------------
    //          lastName
    //-----------------------------

    private var _lastName:String;

    [Bindable('lastNameChange')]
    public function get lastName():String
    {
      return _lastName;
    }

    public function set lastName(value:String):void
    {
      if (_lastName == value)
      {
        return
      }
      _lastName = value  || '';
      invalidateFullName();
      dispatchEvent(new Event('lastNameChange'));
    }

    //---------------------------------------------------------------------
    //
    //          Constructor
    //
    //---------------------------------------------------------------------

    public function Person()
    {
      _firstName = _lastName = '';
    }

    //---------------------------------------------------------------------
    //
    //          Methods
    //
    //---------------------------------------------------------------------

    private function invalidateFullName():void
    {
      dispatchEvent(new Event('fullNameChanged'));
    }
  }
}
Das war der Gedankengang, den ich illustrieren wollte.
Omega Psi ist offline   Mit Zitat antworten
Alt 15-02-2012, 15:54   #7 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 29
Ich habe jetzt herausgefunden an was es lag. Beim Feuern des Events benutze ich "shapeChanged". Später registriere ich mich dann allerdings nicht auf "shapeChanged" sondern auf "propertyChanged". Trotzdem danke für dein Beispiel.
Ist es eigentlich sauberer für solche Events "shapeChanged" zu benutzen oder wie bei den Default-Bindable "propertyChanged"?
Lector ist offline   Mit Zitat antworten
Alt 15-02-2012, 16:35   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Siehe meinen Post#4
Omega Psi ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
event:StatusEvent wird nicht ausgelöst canon ActionScript 3 7 18-10-2010 14:39
Event STATE_CHANGE/COMPLETE wird bei Nutzung von flvplayback nicht ausgelöst mod_x ActionScript 3 1 17-02-2009 13:32
Event wird duch andere Instanz des gleich Objektes ausgelöst green123 ActionScript 3 1 12-02-2009 09:36
NetStream.Stop event wird nicht ausgelöst tentacles ActionScript 2 1 28-02-2008 11:08


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele