I think that might be a distraction, I was asking a question about the rules
of MXML, rather than asking for debugging help for my non-visual component.
But just for fun, I'll explain! I was looking for a way to reuse the nice
way that PopUpButton manages its pop-up, so I created a non-visual component
that you could use to orchestrate "popping up" on rollover or on focus.
<mx:Label id="info" text="Roll over me for more information"/>
<mx:VBox id="moreInfo" includeInLayout="false" visible="false">
<mx:Label text="Hi, I'm more information!" />
</mx:Vbox>
<my:DetailPopup target="{info}" popUp="{moreInfo}"/>
This works really well, and we use it in a few places so we can use ad hoc
detail pop-ups. We've even used it inside a datagrid item renderer:
<mx:DataGridColumn>
<mx:itemRenderer><mx:Component>
<mx:Label id="info" text="Roll over me for more information"/>
<mx:VBox id="moreInfo" includeInLayout="false" visible="false">
<mx:Label text="Hi, I'm more information!" />
</mx:Vbox>
<my:DetailPopup target="{info}" popUp="{moreInfo}"/>
</mx:Component></mx:itemRenderer>
</mx:DataGridColumn>
When we switched to a grid with a repeater, I discovered the prohibition on
nonvisual components that weren't parent of the root tag.
<mx:GridItem>
<mx:Label id="info" text="Roll over me for more information"/>
<mx:VBox id="moreInfo" includeInLayout="false" visible="false">
<mx:Label text="Hi, I'm more information!" />
</mx:Vbox>
(x) <my:DetailPopup target="{info}" popUp="{moreInfo}"/>
</mx:GridItem>
So the solution appears to be to take the guts and put it in its own
component definition, and then do this:
<mx:GridItem>
<my:WholeChunkaStuff/>
</mx:GridItem>
Michael
On Fri, Dec 12, 2008 at 1:25 PM, Rick Winscot <[email protected]>wrote:
> It's difficult to determine what your problem is without knowing a
> little more about what your DetailPopUp does/is. If you post some code it
> would be far easier to determine why one context works and another doesn't.
> Generally... I wouldn't recommend mingling non-visual and visual components
> in mxml.
>
> Your error basically says that your non-visual component doesn't have an
> appropriate interface for the context you are placing it in. e.g. It should
> be a IUIComponent.
>
> http://livedocs.adobe.com/flex/201/langref/mx/core/IUIComponent.html
>
> Rick Winscot
>
>
>
> On 12/12/08 12:49 PM, "Michael Prescott" <[email protected]>
> wrote:
>
>
>
>
> *Short version:
> *
> I have a non-visual component that I'm trying to declare in a repeater, but
> it seems that MXML doesn't allow this. Is this true? How do you get around
> this, create a visual component to wrap the non-visual component?
>
> *Long version:
> *
> I have an ActionScript non-visual component whose declaration looks like
> this:
>
> public class DetailPopup extends EventDispatcher implements IMXMLObject
>
> I've used this successfully inside an inline, MXML item renderer, like
> this:
>
> <mx:DataGridColumn>
> <mx:itemRenderer>
> <mx:Component>
> <mx:VBox>
>
> <!-- a bunch of other stuff, and then my: -->
>
> <my:DetailPopUp/>
>
> <mx:VBox>
> </mx:Component>
> </mx:itemRenderer>
> </mx:DataGridColumn>
>
>
> Now that I'm switching from a DataGrid to a Grid, the code ought to look
> like this:
>
> <mx:GridItem>
> <mx:VBox>
>
> <!-- a bunch of other stuff, and then my: -->
>
> (X) <my:DetailPopUp/>
>
> <mx:VBox>
> </mx:GridItem>
>
> ..except that I'm getting an error, "Component declarations are not allowed
> here. (Note: visual children must implement IUIComponent.)"
>
> After trying out a bunch of scenarios, it looks like non-visual components
> can only be declared in the outermost scope of a component or application.
> Is this true? This is rather awkward, as I need a DetailPopUp for each
> griditem.
>
> Any tips would be very helpful!
>
> Michael
>
>
>
>
>