Carregando treeview dinamicamente em Silverlight 4

Introdução

O Treeview é um controle com estrutura de árvore cuja finalidade principal é para exibir dados hierárquicos sob a forma de nós. Cada nó que tem filhos pode ser recolhido e ampliado.

O objetivo deste artigo é demonstrar como popular um treeview Silverlight 4 através de dados de um banco. Da mesma forma, você poderá consumir dados, por exemplo, de um arquivo XML.

Ferramentas:

  • Visual Studio 2010 ou 2008
  • Silverlight 4
  • Microsoft Blend 4
  • SQL Server 2005 ou 2008

Banco de Dados

Antes de começar a criar o projeto Silverlight, o primeiro passo é criar a database, com nome de DBSite. O banco de dados irá possuir duas tabelas, uma denominada seção e a outra categoria, conforme pode ser visualizado na Figura 1.



Banco de dados

Figura 1 – Banco de dados – DBSite

Download: Script

Nota: Nota: Adicione alguns dados para as tabelas


Iniciando o projeto no Visual Studio

Abra o Visual Studio, em New-Project, escolha o template Silverlight Application, forneça o nome de AppTreeView.

Na Solution Explorer, dentro do projeto Web, adicione um serviço WCF, como mostra a Figura 2 , e coloque o nome de ServicoSite. 


Silverlight-enabled WCF Service

Figura 2 - Serviço WCF

O próximo passo é criar um novo projeto para camada de dados, como traz a Figura 03, e forneça o nome para este projeto de DataModel.

Add Novo Projeto
Figura 3  - Projeto camada de dados


Adicione neste projeto o template ADO.NET Entity Data Model, e forneça o nome de Model.edmx, pressione o botão ok, a seguir selecione a opção Generate from database, como traz a Figura 4.


Ado.Net entity data model
Figura 4 – ADO.NET Entity Data Model 

Após, é necessário escolher a propriedade de conexão de dados, e uma tela é apresentada com as configurações para a connection string do banco de dados, e forneça o nome de 

DBSiteEntities.  Em seguida, tem-se a tela para adicionar as tabelas TBSecao e TBCategoria, e em namespace, coloque o nome de DBSiteModel, como mostra a Figura 5.

Adicionando tabelas

Figura 5 – Adicionando tabelas para o modelo

Crie uma classe dentro do projeto DataModel, com o nome de Secao.cs, e coloque o código como apresentado na Tabela 1.

using DataModel;

namespace DataModel{

    public class Secao{

        private DBSiteEntities _db;

        public Secao() {

            _db = new DBSiteEntities();

        }

        public List<TBSECAO> ListarSecao() {   

            return _db.TBSECAO.Include("TBCATEGORIA").ToList();  }

    }

}

Tabela 1– Código para trazer os dados da tabela TBSECAO


Referencie o Projeto DataModel, dento do projeto Web, como mostra  a Figura 6.

Projeto

Figura 6 – Referencia de projeto

Dentro do serviço WCF adicione o código da Tabela 2.

using DataModel;

using System.Collections.Generic;

[OperationContract]

        public List<TBSECAO> ListarSecao()

        {

            Secao _secao = new Secao();

         

            / Add your operation implementation here

            return _secao.ListarSecao();

        }

Tabela 2 – Retornando uma lista de TBSECAO

Agora vá ao Projeto Silverlight, no arquivo MainPage.XAML adicione um treeview, como traz a Tabela 3.

   <my:TreeView x:Name="tree"></my:TreeView>


Tabela 3 - Adicionando TreeView

E adicione o código para popular o TreeView dentro do Arquivo MainPage.Xaml.cs como mostra a Tabela 4.

using AppTreeView.Service;

using System.Collections.ObjectModel;

using System.Windows.Media.Imaging;

public partial class MainPage : UserControl

    {

        public MainPage(){

            InitializeComponent(); 

            this.Loaded += new RoutedEventHandler(MainPage_Loaded);

        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)

        {

            Service.ServicoSiteClient _cliente = new ServicoSiteClient();

            _cliente.ListarSecaoCompleted += new EventHandler<ListarSecaoCompletedEventArgs>(_cliente_ListarSecaoCompleted);

            _cliente.ListarSecaoAsync();

        }

        void _cliente_ListarSecaoCompleted(object sender, ListarSecaoCompletedEventArgs e)

        {

             if (e.Error != null)

                return;

          ObservableCollection<TBSECAO> _secao =  e.Result;

          TreeViewItem _item    = null;

          StackPanel _panel;

          Image _image;

          TextBlock _text;

          if (_secao != null)

          {  

              for (int i = 0; i < _secao.Count(); i++)

              {

                  _item = new TreeViewItem();

                  _item.Header = _secao.TITULO;

                  for (int j = 0; j < _secao.TBCATEGORIA.Count(); j++)

                  {

                     _text = new TextBlock();

                     _image = new Image();

                     _image.Width = 20;

                     _image.Height = 20;

                  if (_secao.TBCATEGORIA[j].URLIMAGEM != "")

                     {

                         _image.Source = new BitmapImage(new Uri(_secao.TBCATEGORIA[j].URLIMAGEM, UriKind.RelativeOrAbsolute));

                     }

                     _text.Text = _secao.TBCATEGORIA[j].TITULO;                    

                      _panel = new StackPanel();          

                      _panel.Orientation = Orientation.Horizontal;

                      _panel.Children.Add(_image);

                      _panel.Children.Add(_text);

                      _item.Items.Add(_panel);

                  }

                  tree.Items.Add(_item);

              }

          }

        }

    }


Tabela 4 -  Codificação para popular TreeView.

Nota: Poderia ter carregado o treeview por Binding.

Conforme você pode observar no código da Tabela 4 foi criado um objeto do tipo TreeViewItem, e um StackPanel.No objeto do StackPanel foi adicionado dois objetos, um do tipo imagem e outro  do tipo TextBlock. E em seguida, dentro do objeto TreeViewItem foi adicionado o StackPanel. E por último o TreeViewItem foi adicionado dentro do Treeview. Isto mostra que existe uma hierarquia na formatação dos objetos em silverlight.

Execute a aplicação, e o resultado deverá ser similar como mostrado na Figura 7.


Figura 7 – Treeview carregado

 

Neste artigo foi mostrado como popular um treeview dinamicamente através de dados de um banco de dados. De forma simples e objetiva.


blog comments powered by Disqus

NewsLetter

Por favor preencher os campos.
Quer receber artigos?


Receber em HTML?