13 mar 2011

Metadata DefaultProperty

Uma das grandes vantagens de utilizar o MXML é ter a facilidade de compor os componentes através da utilização de tags e atributos. Basicamente todo arquivo MXML segue a estrutura:

1
2
3
4
5
<componente_base_tag propriedade="valor">
    <propriedade_tag>
        <valor>
    </propriedade_tag>
</componente_base_tag>

Entender essa estrutura é simples, estamos setando novos valores para as propriedades do nosso componente base. Em exemplo prático temos:

1
2
3
4
5
6
7
8
9
10
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <s:layout>
        <s:VerticalLayout/>
    </s:layout>

    <s:Group/>

</s:Application>

Saber que uma instância da classe VerticalLayout está sendo atribuída a propriedade layout da classe Application é fácil, mas onde estamos atribuindo a instância da classe Group uma vez que ela não segue a estrutura base do MXML?

Para facilitar a utilização dos componentes no MXML, a Adobe criou a metadata DefaultProperty que, assim como o nome diz, determina uma propriedade a ser utilizada como padrão no MXML caso não haja sua especificação na composição do componentes, isso explica como conseguimos atribuir uma instância da classe Group em uma determinada propriedade da classe Application sem a necessidade de declará-la.

Vamos então criar um exemplo funcional de um componente com a metadata DefaultProperty?

Utilizando a metadada.

1
2
3
4
5
6
7
8
9
10
11
12
13
package
{
    import spark.components.DropDownList;

    [DefaultProperty("prompt")]
    public class NewDropDownList extends DropDownList
    {
        public function NewDropDownList()
        {
            super();
        }
    }
}

Em sintaxe: [DefaultProperty(“propriedade”)]
No exemplo estou extendendo a classe DropDownList e apenas determinando que sua propriedade default é a propriedade prompt.

Utilizando a Classe DropDownList.

1
2
3
4
5
<s:DropDownList>
    <s:prompt>
        Selecione um item
    </s:prompt>
</s:DropDownList>

Na classe DropDownList precisamos abrir a tag da propriedade prompt antes de atribuir o seu valor.

Utilizando a Classe NewDropDownList.

1
2
3
<local:NewDropDownList>
    Selecione um item
</local:NewDropDownList>

Na nossa classe recém criada não precisamos abrir a tag da propriedade, pois avisamos o compilador que nossa propriedade padrão é o prompt, logo, qualquer valor atribuído diretamente a tag do componente base será direcionado a propriedade padrão.

Não posso deixar de comentar que a metadata DefaultProperty adicionada na classe NewDropDownList sobrescreveu a DefaultProperty dataProvider que ele herda da classe SkinnableDataContainer, logo muito cuidado na hora de utilizar essa metadata em componentes extendidos!

Comments

  • Guilherme Sjlender
    março 13, 2011 Responder

    Legal a dica…
    Parabéns Bruno!

  • Fernando Valentini
    março 22, 2011 Responder

    Muito legal a dica!
    Estou adicionando nos meus componentes, obviamente tomando cuidado com os que herdam componentes do Flex.

Leave a Comment