Lendo Arquivo XML no Silverlight

Publicado: 9 09UTC outubro 09UTC 2011 em Linq, Programação, Silverlight, XML

Olá a todos, hoje veremos como ler um arquivo xml no Silverlight.

Estarei utilizando o Visual Studo 2010 Premium nesse exemplo, mas pode ser feito através do Visual Studo Express. Em caso de dúvidas de uma  olhada nesse post: http://dtomasini.wordpress.com/2010/05/01/o-que-e-silverlight.

Primeiramente vamos criar um novo projeto Silverlight, para isso clique em File => New => Project. Escolha no menu Templates a opção  Silverlight e selecione Silverlight Application. Eu nomeei como ReadXML.

No arquivo MainPage.xaml crie um DataGrid e um Botão, você pode se basear na listagem 1.

<UserControl x:Class="ReadXML.MainPage"
              xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
     <Grid x:Name="LayoutRoot" Background="White">
         <StackPanel Margin="10">
             <Button x:Name="btnRead" Content="Ler XML" Width="100" Height="24" HorizontalAlignment="Left" Click="btnRead_Click" Margin="10"/>
             <sdk:DataGrid x:Name="gridCollection"  AutoGenerateColumns="False" Width="322" HorizontalAlignment="Left" Margin="10" >
                 <sdk:DataGrid.Columns>
                     <sdk:DataGridTemplateColumn Header="Nome" MinWidth="160">
                         <sdk:DataGridTemplateColumn.CellTemplate>
                             <DataTemplate>
                                 <TextBlock Text="{Binding CatalogName}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                             </DataTemplate>
                         </sdk:DataGridTemplateColumn.CellTemplate>
                     </sdk:DataGridTemplateColumn>
                     <sdk:DataGridTemplateColumn Header="Imagem" MinWidth="160">
                         <sdk:DataGridTemplateColumn.CellTemplate>
                             <DataTemplate>
                                 <Image Width="50" Height="50" Source="{Binding ImageUrl}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                             </DataTemplate>
                         </sdk:DataGridTemplateColumn.CellTemplate>
                     </sdk:DataGridTemplateColumn>
                </sdk:DataGrid.Columns>
             </sdk:DataGrid>
         </StackPanel>
     </Grid>
 </UserControl>

Listagem 1 – MainPage.xaml

Com nossa View pronta, o próximo passo é criar uma nova classe no Projeto ReadXML, da qual eu nomeei como XmlItem. A classe é bem simples, crei duas propriedades strings nela, uma chamada CatalogName e a outra ImageUrl. Conforme listagem 2.

 {
     public class XmlItem
     {
         private string _catalogName;
         public string CatalogName
         {
             get { return this._catalogName; }
             set { this._catalogName = value; }
         }
         private string _imageUrl;
         public string ImageUrl
         {
             get { return this._imageUrl; }
             set { this._imageUrl = value; }
         }
     }
 }

Listagem 2 – Classe XmlItem

O terceiro passo é cria o nosso arquivo xml, para isso crie uma nova pasta no projeto ReadXML chamada Xml e adicione um novo arquivo xml na mesma. Eu nomeei de CatalogAndImage.xml e  vamos criar a seguinte estrutura (listagem 3):

<catalogs>
  <catalog>
    <name>Dellicious</name>
    <image>/ReadXML;component/Images/dellicious.png</image>
  </catalog>
  <catalog>
    <name>Diggs</name>
    <image>/ReadXML;component/Images/digg.png</image>
  </catalog>
  <catalog>
    <name>Reddit</name>
    <image>/ReadXML;component/Images/reddit.png</image>
  </catalog>
  <catalog>
    <name>RSS</name>
    <image>/ReadXML;component/Images/rss.png</image>
  </catalog>
  <catalog>
    <name>Stumble</name>
    <image>/ReadXML;component/Images/stumble.png</image>
  </catalog>
  <catalog>
    <name>Twitter</name>
    <image>/ReadXML;component/Images/twitter.png</image>
  </catalog>
</catalogs>

Listagem 3 – CatalogAndImage.xml

Crie a pasta Images e adicione algumas imagens. No meu caso são 6 images como vocês já notaram pelo arquivo xml. Renomeias conforme o seu arquivo xml.

Agora partiremos para a finalização do nosso projeto. Vamos editar o evento de click do nosso botão na MainPage.xaml.cs. Cole o código da listagem 4.

1. XDocument xdoc = XDocument.Load("/ReadXML;component/Xml/CatalogAndImage.xml");
2.    List<XmlItem> dataList = (from item in xdoc.Descendants("catalog")
3.                              select new XmlItem()
4.                              {
5.                                  CatalogName = item.Element("name").Value,
6.                                  ImageUrl = item.Element("image").Value
7.                               }).ToList();
8.    this.gridCollection.ItemsSource = dataList.ToList();

Listagem 4 – Evento do Click do Botão

O código é bem simples, na linha 1 é instanciado um XDocument, que nada mais é que um documento xml. Carregado o CatalogAndImage.xml, na linha 2 nós declaramos uma lista de XmlItem e utilizando o Linq to Xml filtramos e carregamos a mesma. Na linha 8 apenas informamos que o ItemsSource da nossa grid é a List<XmlItem>, no caso dataList. O resultado pode ser visto na figura 1.

Figura 1 – Resultado

Conclusão

Como podemos notar é algo muito simples de ser feito e bastante prático no dia a dia.

PS: Para aqueles que não conhecem LINQ, estou desenvolvendo um post sobre o assunto.

O Entity Framework não é novo, ele já existia no .NET 3.5, como uma nova forma de acesso a dados, nos trazendo a possibilidade de trabalhar com objetos, ao invés de adapters.

Ele nos permite criar aplicações em que o acesso a dados é feito com base em um modelo conceitual e não utilizando comandos diretos à base de dados. Isto permite que o programador se abstraia totalmente da base de dados (criação de ligações de acesso, comandos, parâmetros, etc. ) e utilize apenas objetos durante o desenvolvimento.

A versão 4.0 do Entity Framework, que está disponível na .NET Framework 4.0, tem um conjunto de novas funcionalidades e melhorias, como é o caso de suporte a POCO – Plain Old CLR Objects (permite criar classes que não herdam, nem implementam nenhuma outra classes ou interface), abordagem Model-First (permite criar primeiro o modelo conceptual e, com base nele, criar a base de dados), suporte para o uso de funções em LINQ to Entities, Complex Types (criação de tipos de dados complexos), Deferred Loading ou Lazy Loading (capacidade de carregar as propriedades de associação das entidades no momento em são chamadas, se forem chamadas), etc. Não é especifica apenas para o SQL Server, pois existem providers que permitem usar outras bases de dados, como Oracle, MySql, PostgreSQL, DB2, SQL Anywhere, Ingres, Progress, Firebird, Synergy, etc.

Existem várias vantagens na utilização de um ORM (Object-Relational Mapping), que tornam a sua adopção quase inevitável, mas vejamos o seguinte exemplo:

"SELECT * FROM clientes WHERE nome = ‘Daniel’ AND morada = ‘Casa’"

Este exemplo irá listar todos os clientes que tenham como nome “Daniel” e que tenham como morada a “Casa”.

Imaginemos que o programador ou o DBA (administrador do banco de dados) altera o campo “nome” para “nomecompleto”, pois quer que se registe o nome completo do utilizador e, desta forma, o nome do campo fica mais coerente. Se aplicação for compilada não é detectado qualquer problema e só no momento de execução irá ocorrer um erro. Situações como estas são muito frequentes e podem representam vários erros na aplicação.

Este é apenas um exemplo de como se pode beneficiar, e muito, da utilização do Entity Framework, mas existem muito mais vantagens com a utilização de LINQ to Entities, intellisense, código mais fácil de manter e atualizar.

Neste artigo, que será uma breve introdução ao Entity Framework, irei apenas mostrar como construir um modelo relacional de uma base de dados SQL, uma abordagem database-first, e como executar algumas operações CRUD.

Para melhor demonstrar o Entity Framework, prefiro ir explicando os conceitos conforme desenvolvemos um exemplo, de forma a termos uma visão real do que a plataforma faz.

Criação do Modelo Relacional (database-first)

Para criação de um modelo relacional iremos usar a seguinte base de dados SQL:

modelo_relacional

Figura 1 – Modelo Relacional

Como é possível ver nesta imagem, existem apenas três tabelas, com as respectivas chaves primárias/estrangeiras: Person, PersonPhones e PersonEmails.

Criação do Projeto

Vamos criar um novo projeto no Visual Studio. File => New => New Project, escolha Silverlight Application, eu nomeei o mesmo como ExemploCRUD. Ver figura 2 e 3.

newProject

Figura 2 – Novo Projeto

newProject_WebProject

Figura 3 – Definições do Projeto Silverlight

Criação do ADO.NET Entity Data Model

O próximo passo é adicionar um novo item ao projeto ExemploCRUD.Web. Menu => Project => “Add New Item”, selecione no grupo de templates “Data” o item “ADO.NET Entity Data Model”. Isso irá iniciar um Wizard que permitirá criar o modelo.

Eu nomeei como ExemploModel.edmx, conforme figura 4.

exemploModel

Figura 4 – Add New Item

Logo em seguida selecione “Generate from database” e click em “Next”.

A próxima opção permite fazer a conexão com o banco de dados, você pode escolher uma já existente ou criar uma nova conexão.

No meu caso, eu criei uma nova conexão, basta clica no botão “New Connection…”. Abrirá a janela de Connection Properties, informe os dados sobre o banco e click em OK. Ver Figura 5.

new_connection

Figura 5 – Connection Properties

De volta à janela “Entity Data Model Wizard”, marque as opções conforme a Figura 6 e para o nome da conexão, nomeio ExemploEntities.

exemploEntities

Figura 6 – ExemploEntities

Feito isso click em Next. A última opção deste Wizard é onde são selecionados os objetos a serem utilizados no modelo. Neste exemplo são escolhidas as três tabelas supracitadas. Ver figura 7.

exemploModelTables

Figura 7 – Finalização

  • Pluralize or singularize generated object names: Deixar no plural os nomes dos objetos, por exemplo Order passar para Orders. Vamos marca-la;
  • Include foreign keu columns in the model: Devemos deixar marcada para expor as chaves estrangeiras do nosso modelo de banco de dados;
  • Model Namespace: o Namespace no qual vai estar contido o modelo, eu nomeei ExemploModel.

Click em Finish, após este processo está criado o arquivo edmx, que não é mais do que um conjunto de classes e métodos que nos permitirá acessar o banco de dados de uma forma simples, como iremos ver em seguida.

O Visual Studio vai nos mostrar o Designer do edmx, junto com as três entidades já adicionadas. Ver Figura 8.

designer_edmx

Figura – 8 – Design

Vamos entender um pouco sobre o que na verdade é o edmx. O edmx é um arquivo XML, no qual vai constar o mapeamento para o nosso modelo físico. Ele é composto por três arquivos internos, que são desmembrados em runtime, que são: SSDL (Storage Model Content), o CSDL (Conceptual Model Content) e o MSL (Mapping Model Content). Segue abaixo o conteúdo de cada uma destas partes do edmx (retirado da MSDN Library).

  • SSDL (Storage Model): Descreve o banco de dados no qual estaremos trabalhando os dados.
  • CSDL (Conceptual Model): Descreve os nossos objetos no modelo, sejam entidades, tipos complexos, navigation properties.
  • MSL (Mapping Model): Descreve o mapeamento objeto-relacional (ORM), para que o SSDL e o CSDL possam se relacionar corretamente.
Criação do WCF Data Service

O próximo passo é adicionar um novo item ao projeto ExemploCRUD.Web. Menu => Project => “Add New Item”, selecione no grupo de templates “Web” o item “WCF Data Service”, e nomeei-o ExemploDataService, conforme figura 9.

exemploDataService

Figura 9 – ExemploDataService

WCF Data Services é uma forma de expor um modelo de dados do Entity Framework através de uma interface REST. O DataService é uma extensão do WCF, isto é, pode ser hospedado como qualquer serviço WCF. É uma tecnologia que visa facilitar o acesso a dados tanto de aplicações Web comuns, como AJAX, Silverlight e .NET.

Para expor os dados via WCF Data Services, é preciso que se tenha uma fonte de dados que suporte consultas utilizando LINQ, isto é, que implemente IQueryable/IUpdatable. Resumidamente, a aplicação pede um endereço para o serviço, e este endereço é traduzido como uma consulta LINQ para que então, o provedor de dados retorne os dados de interesse.

Parece meio confuso, mas na verdade o WCF Data Service nos dá as seguintes possibilidades:

  • Fornece uma API que nos permite criar e consumir dados através de HTTP, utilizando serviços RESTful;
  • Suporte a todas as operações de banco de dados através de URI;
  • Capacidade de expor um Modelo de Entidade através de um URI;
  • Suporte CRUD;
  • Pode ser consumido por qualquer aplicação em diferentes tipos de clientes como Windows, SilverLight, Web, AJAX e Console.

Vamos editar o nosso WCF Data Service (ExemploDataService.svc.cs), e deixa-lo de acordo com a listagem 1:

1. using System.Data.Services;
 2. using System.Data.Services.Common;
 3.
 4. namespace ExemploCRUD.Web
 5. {
 6. public class ExemploDataService : DataService<ExemploEntities>
 7. {
 8. // This method is called only once to initialize service-wide policies.
 9. public static void InitializeService(DataServiceConfiguration config)
 10. {
 11. // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
 12. // Examples:
 13. config.SetEntitySetAccessRule("*", EntitySetRights.All);
 14. config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
 15. config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
 16. }
 17. }
 18. }

Listagem 1 – ExemploDataService.svc.cs

  • Na linha 6, é apenas informado a nossa classe de fonte de dados, ExemploEntities;
  • Nas linhas 13 e 14, vamos descomentá-la e alterar para permitir acesso a todas as regras e operações.

Feito isso compile a sua aplicação, e com o botão direito do mouse em cima do arquivo ExemploDataService.svc, selecione a opção “View in Browser”. Se tudo ocorreu corretamente até aqui, você verá os dados de um arquivo xml mostrando as tabelas do nosso banco de dados. Ver figura 10.

exemploDataService_inBrowser

Figura 10 – Rodando o Serviço WCF

Até aqui tudo certo, o próximo passo é incluir uma “Service Reference” no projeto ExemploCRUD. Para isso clique com o botão direito do mouse no projeto ExemploCRUD e selecione a opção “Add Service Reference”.

Feito isso abrirá uma janela (ver figura 11), clique no botão “Discover”, de o nome de “ExemploServiceReference” e de OK. Isso incluirá uma referência ao nosso serviço WCF.

exemploServiceReference

Figura 11 – ExemploServiceReference

Interface

Por questões didáticas o exemplo não utilizará nenhum pattern. A listagem 2 mostra o código final para a MainPage.xaml. Trata-se de uma interface simples, como pode ser conferida na figura 12.

<UserControl x:Class="ExemploCRUD.MainPage"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
 mc:Ignorable="d"
 d:DesignHeight="300" d:DesignWidth="400">
 <Grid x:Name="LayoutRoot" Background="White">
 <StackPanel Margin="10">
 <sdk:DataGrid AutoGenerateColumns="False" x:Name="gridData" Height="400" Width="800" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" >
 <sdk:DataGrid.Columns>
 <sdk:DataGridTemplateColumn Header="Nome">
 <sdk:DataGridTemplateColumn.CellTemplate>
 <DataTemplate>
 <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/>
 </DataTemplate>
 </sdk:DataGridTemplateColumn.CellTemplate>
 </sdk:DataGridTemplateColumn>
 <sdk:DataGridTemplateColumn Header="Email">
 <sdk:DataGridTemplateColumn.CellTemplate>
 <DataTemplate>
 <TextBlock Text="{Binding PersonEmails[0].Email}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/>
 </DataTemplate>
 </sdk:DataGridTemplateColumn.CellTemplate>
 </sdk:DataGridTemplateColumn>
 <sdk:DataGridTemplateColumn Header="Tipo de Email">
 <sdk:DataGridTemplateColumn.CellTemplate>
 <DataTemplate>
 <TextBlock Text="{Binding PersonEmails[0].EmailType}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/>
 </DataTemplate>
 </sdk:DataGridTemplateColumn.CellTemplate>
 </sdk:DataGridTemplateColumn>
 <sdk:DataGridTemplateColumn Header="Telefone">
 <sdk:DataGridTemplateColumn.CellTemplate>
 <DataTemplate>
 <StackPanel Orientation="Horizontal">
 <TextBlock Text="{Binding PersonPhones[0].DDI}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/>
 <TextBlock Text="{Binding PersonPhones[0].DDD}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/>
 <TextBlock Text="{Binding PersonPhones[0].Number}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/>
 <TextBlock Text="{Binding PersonPhones[0].Ext}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/>
 </StackPanel>
 </DataTemplate>
 </sdk:DataGridTemplateColumn.CellTemplate>
 </sdk:DataGridTemplateColumn>
 <sdk:DataGridTemplateColumn Header="Tipo de Telefone">
 <sdk:DataGridTemplateColumn.CellTemplate>
 <DataTemplate>
 <TextBlock Text="{Binding PersonPhones[0].PhoneType}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/>
 </DataTemplate>
 </sdk:DataGridTemplateColumn.CellTemplate>
 </sdk:DataGridTemplateColumn>
 </sdk:DataGrid.Columns>
 </sdk:DataGrid>
 <StackPanel Width="800" HorizontalAlignment="Center" Margin="5">
 <StackPanel Orientation="Horizontal">
 <TextBlock Text="Nome:" Width="100" Margin="5" />
 <TextBox x:Name="txtName" Text="{Binding SelectedItem.Name, ElementName=gridData}" Width="200" Margin="5" />
 </StackPanel>
 <StackPanel Orientation="Horizontal" >
 <TextBlock Text="Email:" Width="100" Margin="5" />
 <TextBox x:Name="txtEmail" Text="{Binding SelectedItem.PersonEmails[0].Email, ElementName=gridData}" Width="200" Margin="5" />
 <TextBlock Text="Tipo de Email:" Width="100" Margin="5" />
 <TextBox x:Name="txtEmailType" Text="{Binding SelectedItem.PersonEmails[0].EmailType, ElementName=gridData}" Width="200" Margin="5" />
 </StackPanel>
 <TextBlock Text="Telefone" Margin="5" HorizontalAlignment="Left"/>
 <StackPanel Orientation="Horizontal" >
 <TextBlock Text="DDI:" Width="100" Margin="5" />
 <TextBox x:Name="txtDDI" Text="{Binding SelectedItem.PersonPhones[0].DDI, ElementName=gridData}" Width="200" Margin="5" />
 <TextBlock Text="DDD:" Width="100" Margin="5" />
 <TextBox x:Name="txtDDD" Text="{Binding SelectedItem.PersonPhones[0].DDD, ElementName=gridData}" Width="200" Margin="5" />
 </StackPanel>
 <StackPanel Orientation="Horizontal" >
 <TextBlock Text="Número:" Width="100" Margin="5" />
 <TextBox x:Name="txtPhoneNumber" Text="{Binding SelectedItem.PersonPhones[0].Number, ElementName=gridData}" Width="200" Margin="5" />
 <TextBlock Text="Ramal:" Width="100" Margin="5" />
 <TextBox x:Name="txtExt" Text="{Binding SelectedItem.PersonPhones[0].Ext, ElementName=gridData}" Width="200" Margin="5" />
 </StackPanel>
 <StackPanel Orientation="Horizontal">
 <TextBlock Text="Tipo:" Width="100" Margin="5" />
 <TextBox x:Name="txtPhoneType" Text="{Binding SelectedItem.PersonPhones[0].PhoneType, ElementName=gridData}" Width="200" Margin="5" />
 </StackPanel>
 </StackPanel>
 <StackPanel Orientation="Horizontal" Margin="5" HorizontalAlignment="Center">
 <Button x:Name="btnInsert" Content="Incluir" Click="btnInsert_Click" Width="100" Height="26"/>
 <Button x:Name="btnEdit" Content="Editar" Click="btnEdit_Click" Width="100" Height="26"/>
 <Button x:Name="btnDelete" Content="Deletar" Click="btnDelete_Click" Width="100" Height="26"/>
 <Button x:Name="btnLoad" Content="carregar" Click="btnLoad_Click" Width="100" Height="26"/>
 </StackPanel>
 </StackPanel>
 </Grid>
 </UserControl>

Listagem 2 – Código Final da MainPage.xaml

view

Figura 12 – Interface do Usuário

As Quatro Operações

As operações CRUD (acrónimo de Create, Read, Update e Delete em Inglês) são operações básicas, fundamentais para a manipulação da base de dados e importantes, pois requerem, sem a utilização de um ORM como o Entity Framework, trabalho que em muitas vezes é complexo.

O funcionamento de todas as operações são muito semelhantes. Criada uma nova instância da nossa entidade (neste exemplo “ExemploEntities”), onde a mesma herda de uma classe da Entity Framework chamada ObjectContext, que é a classe primária e responsável por gerir as informações.

Os serviços WCFs podem ser consumidos de duas formas:

  • Síncrona: Quando uma requisição é feita, o processo remetente é bloqueado até que a recepção correspondente seja realizada, ou seja, a aplicação ficará bloqueada aguardando o resultado;
  • Assíncrona: A operação será realizada em um thread secundária, permitindo que a aplicação continue trabalhando enquanto o serviço é executado. No Silverlight é possível apenas a realização de operações assíncronas.
Inserindo Registros

Na listagem 3 é apresentado o código responsável pelo o trabalho de inserção de novos registros no banco de dados.

Para inserir novos registos, neste caso uma nova pessoa, criamos uma nova instância da nossa entidade onde é solicitado o endereço do serviço, é a mesma url da figura 10. Criamos um novo Person. Depois adicionamos o objeto através do método AddToPeople(person) e, finalmente, executamos o método BeginSaveChanges que irá neste caso inserir um novo registo no banco de dados. O método EndSaveChanges é o responsável por nos dar o retorno da ação no banco.

1. ExemploEntities entities = new ExemploEntities(new Uri("http://localhost:56903/ExemploDataService.svc/"));
 2.
 3. Person person = new Person() { ID = Guid.NewGuid(), Name = this.txtName.Text };
 4.
 5. entities.AddToPeople(person);
 6.
 7. entities.BeginSaveChanges((result) =>
 8. {
 9. entities.EndSaveChanges(result);
 10. }, null);

Listagem 3 – Insert

Editando Registros

Na listagem 4 é apresentado o código responsável pelo trabalho de edição dos registros do banco de dados.

Para editar os registros, igualmente a inserção nós criamos uma nova instância entidade, criamos um novo Person, e informamos que o ID é o mesmo do objeto selecionado na nossa grid e que o nome é o informado no textbox. Depois devemos informar ao entity framework qual tabela será alterada, isso fazemos através do método AttachTo, logo após é passado o novo objeto com o uso do método UpdateObject e finalmente igual a inserção, executamos o método BeginSaveChanges que irá atualizar os dados da nossa pessoa e o método EndSaveChanges que novamente é o responsável por nos dar o retorno da ação no banco.

1. ExemploEntities entities = new ExemploEntities(new Uri("http://localhost:56903/ExemploDataService.svc/"));
 2.
 3. Person person = new Person() { ID = ((Person)this.gridData.SelectedItem).ID, Name = this.txtName.Text };
 4.
 5. entities.AttachTo("People", person);
 6. entities.UpdateObject(person);
 7.
 8. entities.BeginSaveChanges((result) =>
 9. {
 10. entities.EndSaveChanges(result);
 11. }, null);

Listagem 4 – Update

Deletando Registros

Na listagem 5 é apresentado o código para a exclusão dos registros no banco de dados.

A única diferença desse método para o de edição é o uso do método DeleteObject, que é o responsável por informar qual objeto será deletado, apenas a chave primária é necessário informar, no nosso caso é o ID. Todo o resto funciona nos mesmos moldes da Edição.

1. ExemploEntities entities = new ExemploEntities(new Uri("http://localhost:56903/ExemploDataService.svc/"));
 2.
 3. Person person = new Person() { ID = ((Person)this.gridData.SelectedItem).ID };
 4.
 5. entities.AttachTo("People", person);
 6. entities.DeleteObject(person);
 7.
 8. entities.BeginSaveChanges((result) =>
 9. {
 10. entities.EndSaveChanges(result);
 11. }, null);

Listagem 5 – Delete

Listando Registros

Na listagem 6 apresenta o código para listar os dados da tabela Person, note que esse método se difere dos outros.

Novamente criamos uma nova instância da nossa entidade e agora com o uso do LINQ to Entities, vamos selecionar todos os registros de Person. Note que eu uso um Expand para que o mesmo nos traga os dados da relação com PersonEmail e PersonPhone.

Outra particularidade é o uso do método BeginExecute, que irá executar a query e o método EndExecute que nos trará o resultado da pesquisa, neste caso trata-se de um IEnumerable<Person>.

 1. ExemploEntities entities = new ExemploEntities(new Uri("http://localhost:56903/ExemploDataService.svc/"));
 2.
 3. var query = (from A in entities.People.Expand("PersonEmails, PersonPhones")
 4. select A) as DataServiceQuery<Person>;
 5.
 6. query.BeginExecute((result) =>
 7. {
 8. this.gridData.ItemsSource = query.EndExecute(result).ToList();
 9. }, null);

Listagem 6 – Load

Conclusão

O Entity Framework é uma excelente opção para se trabalhar com bases de dados. Simples de utilizar permite-nos trabalhar apenas com objetos, intellisense, nos resolve inúmeros problemas habituais quando se trabalha diretamente com o banco de dados e nos possibilita o desuso do SqlCommands, SqlConnections, etc.

O download da aplicação pode ser feito através desse link.

Link de Apoio:

Fontes:

Hoje vou falar sou o Windows Azure, algo que tem grande potencial para crescer muito rapidamente. Desenvolver para Windows Azure não requer muitas ferramentas e nem muita configuração, é bastante simples.

Instalação

Visual Studio 2010

O Windows Azure funciona apenas com Visual Studio 2010, para quem não tem uma versão paga dele uma boa pedida é o Visual Studio Web Developer 2010 Express: download totalmente gratuito.

Eu recomendo a utilização do Visual Studio para desenvolvimento nas plataformas .Net.

SQL Server

Caso você não possua o SQL Server instalado. A Microsoft disponibiliza duas versões totalmente gratuitas:
- SQL Express 2005.
- SQL Express 2008.

Internet Information Services

É necessário ter instalado e habilitado o IIS 7.0 ou superior com suporte para ASP.NET. Também é disponibilizado gratuitamente o IIS 7.

Azure SDK e Toolkit

Estas ferramentas instalarão os templates de projetos e outras ferramentas necessárias ao desenvolvimento e também o SDK do Windows Azure.
O download do SDK e Toolkit podem ser feito aqui. Se preferir apenas o SDK (esse é obrigatório ter instalado para desenvolver para Azure), os links são: Standalone SDK x64 ou Standalone SDK x86.

Agora você tem um ambiente configurado, vamos a Introdução.

Introdução

Imagine uma aplicação ASP.NET instalada num grupo de servidores para atendimento de requisições que chegam a partir de clientes Web. Imagine ainda que atrás dessa bateria de servidores temos um grupo de máquinas para as regras  de  negócio,  coordenação  de  processos  ou  mesmo  serviços  implementados  em  WCF  –  Windows Communication Foundation, fornecendo funcionalidades para essa aplicação. Também no back-end encontramos as máquinas para bancos de dados ou sistemas de integração com o legado da empresa, acessando as chamadas aplicações linhas de negócio (LOB – Line of Business Applications). Esse cenário é muito comum nas empresas hoje em dia, implementado  numa  infra-estrutura  própria  (on-premise)  ou eventualmente  com  máquinas em provedores e hosts locais.

A partir de uma campanha de marketing, que coloque em evidência sua empresa, ou mesmo devido o crescente interesse pelas funcionalidades da aplicação, o volume de transações deve crescer ao longo do tempo, aumentando o número de requisições  ou  mesmo  de  usuários  simultâneos  nas  páginas  e  serviços  da  solução.  Em seu planejamento, você prepara esse crescimento, disparando a compra de mais servidores, mais infra-estrutura de rede e a configuração da nova parte da TI para a aplicação. Com esse crescimento, ganhamos um custo de operação adicional, mais máquinas para administrar, monitorar, enquanto você passa a ser responsável pela atualização de software básico e instalação das funcionalidades da aplicação em mais máquinas. Os riscos e desafios aumentam.

Imagine agora que o volume de  acesso  e  requisições  diminua  por  alguma  razão,  estabilizando  num  patamar inferior ao volume inicialmente previsto de crescimento, recuando para o volume original de acesso. Suas máquinas estão agora ociosas a maior parte do tempo, ainda consumindo custos de operação, administração, energia elétrica, monitoração, etc. Não seria interessante poder simplesmente mudar um arquivo de configuração e “desprovisionar” essas máquinas adicionais, pagando novamente os  custos  originais  do  sistema?  E que tal  fazer  esse provisionamento/desprovisionamento quantas vezes quiser, enquanto for necessário?  O cenário apresentado é o ambiente perfeito para o modelo de computação na nuvem e o Windows Azure.

Cloud Computing

De forma simplificada, podemos definir o cloud computing  ou  computação  na  nuvem  como  um  ambiente  de processamento  e  armazenamento  de  dados massivo,  de  alta  escalabilidade  e  alta  disponibilidade,  acessível  via interfaces web como HTTP, REST e SOAP, instalado em datacenters de última geração espalhados pelo mundo.

Uma grande característica desse modelo de computação é o provisionamento elástico da computação: olhando o exemplo da introdução, podemos iniciar a operação do sistema com 10 máquinas previstas para o front-end e back-end. Com o crescente volume de requisições, podemos contratar novas máquinas, passando para um cenário de 20 máquinas para o front-end e back-end, de forma dinâmica, através da configuração do ambiente via um portal de administração, por exemplo. Terminado o pico de utilização, podemos simplesmente retornar para a configuração original de 10 máquinas, apenas atualizando a configuração do ambiente na nuvem. Esse poder de configuração é conhecido como computação elástica, onde o provisionamento é feito de modo dinâmico, conforme a demanda pela aplicação.  Ao mesmo tempo, novos modelos de contração, subscrição de serviços e licenciamento estão associados, onde a empresa pode pagar apenas pela infra-estrutura que realmente usa.

O principal objetivo da computação em nuvem, é disponibilizar recursos aaS (as a Service), desta forma podemos disponibilizar SaaS (Software as a Service), HaaS (Hardware as a Service), dentre outros. Desta forma, podemos fazer um provisionamento e melhorias de processamento de hardware, alta-disponibilidade de aplicativos e capacidade computacional, que fique transparente para o usuário e que ele não tenha down-time, ou seja, que não parem os serviços durante o provisionamento.

Fazendo algumas contas, você verá que o cenário de computação na nuvem pode oferecer uma grande redução nos custos de administração e operação da TI nas empresas, o que tem explicado o interesse crescente de clientes e fornecedores de software, como a Microsoft.

Entre as características presentes no Windows Azure destacamos sua natureza para o “utility computing”, onde diversos serviços  são  oferecidos  pelo  sistema  operacional  para  administrar  e  abstrair  os  recursos  presentes  no datacenter, como:

- Facilidade para expandir para novas localidades (geo-distribuição);

- Atualização viva de novas funcionalidades de software;

- Aplicação de patches e correções de sistema operacional;

- Diagnóstico e recuperação de falhas de hardware no próprio datacenter;

- Grande capacidade de armazenamento com alta disponibilidade;

- Lidar com o aumento de tráfego;

- Diagnosticar e responder a falhas de serviços.

Vamos olhar um pouco mais do núcleo de operação do Windows Azure: ele é composto pelos componentes de processamento, gerenciamento de serviços (Service Management), virtualização (Virtualized Compute), espaço de armazenamento  (Storage)  e  tipos  de  dados  específicos  para  o  ambiente  de  computação  elástica,  como  Tables, Blobs, Queues e Locks.

Componentes do Núcleo do Windows Azure

Alguns cenários de aplicações são especialmente aderentes ao modelo de computação na nuvem, como:

- SaaS LOB Applications, ou aplicações  linhas de negócio no modelo SaaS (Software as a Services), oferecendo funcionalidades como serviços. Alguns exemplos são CRM SaaS, HR SaaS, ERP SaaS, etc;

- Aplicações Web Colaborativas, envolvendo diversos dispositivos e usuários com a manipulação de formatos de dados diversos;

- Aplicações com Hub de dados compartilhados, envolvendo um  volume  crescente  de  dados compartilhados  entre  diversas  empresas,  como  cenários  de  cadeias  de  suprimentos,  integração  entre empresas, etc;

- Aplicações Web com Business Intelligence e Data Mining, com volumes crescentes de dados e armazenamento de informações.

Muitos outros cenários são aderentes ao modelo, a lista acima é apenas um começo.

Azure Services

- Windows Azure – É o coração de tudo. O Windows Azure é o sistema operacional que vai prover todos os recursos. Nele também é onde encontramos o gerenciamento de serviços, aplicativos e provisionamento de computação;

- SQL Azure – É o SQL Server na nuvem. Com ele, podemos ter a disposição um banco de dados relacional, com hospedagem e processamento na nuvem. Ainda não tem todos os recursos do SQL Server on-premises (o SQL que instalamos em nossos servidores, a versão “comum” do SQL);

- Windows Azure AppFabric – Framework de comunicação e gerenciamento de aplicativos e recursos na nuvem e on-premises.

Preços

Veja a lista abaixo:

- “Pay As You Go”;

- Conta introdutória, algo como um trial do serviço;;

- Benefícios da Plataforma Windows Azure para Assinantes do MSDN.

Outra coisa é que é necessário ter cartão de crédito para a criação da conta, pois se passar o limite de testes, haverá cobrança normal do serviço.

Construindo uma aplicação ASP.NET para Windows Azure e SQL Azure

Nesse artigo você irá aprender a migrar uma base de dados para o SQL Azure, criar sua primeira aplicação ASP.NET Web Role, acessar os dados de uma instância de SQL no SQL Azure e finalmente publicar sua aplicação no Windows Azure. Confira aqui.

Eventos usando expressões Lambda

Publicado: 2 02UTC dezembro 02UTC 2010 em Programação

Uma expressão lambda é uma função anônima que pode conter expressões e instruções, e pode ser usada para criar Delegates ou tipos de árvores de expressão.

Todas as expressões lambda usam o operador lambda , que é lido como “vai para”. O lado esquerdo do operador lambda especifica os parâmetros de entrada (se houver) e o direito contém a expressão ou o bloco de instruções O expressão lambda x => x * x é lido ” x recebe x vezes x. ” Esta expressão pode ser atribuída a um tipo delegate.

Uma expressão Lambda faz o disparo de eventos sem que se precise criar voids para que ele seja executado.
A expressão abaixo funciona a partir do Framework 3.5 tanto em projetos Web como Windows Form.

Exemplo padrão.

private void LoadMethods()
{
button.Click += new EventHandler(btnSend_Click);
}

private void button_Click(object sender, EventArgs e)
{
textBox.Text = “Daniel Carraro Tomasini”;
}

Exemplo com expressão Lambda

private void LoadMethods()
{
button.Click += (s, ev) => { textBox.Text = “Daniel Carraro Tomasini”; };
}

O código usando a expressão Lambda fica muito mais simples.

Valew e até mais!

E aí galera! Como havia prometido, trago nesse post uma séries de facilidades para quem quer aprender a desenvolver para Windows Phone 7.

A Microsoft sabe que uma das chaves para o sucesso desta sua nova plataforma móvel é a disponibilidade de aplicações para o aparelho, e por isto está entregando uma experiência de desenvolvimento extremamente prazerosa, poderosa, simples, bem documentada, e grátis, isto é, todo o ferramental e documentação que você precisa para começar a brincar com o aparelho estão disponíveis para download público na internet.

Então vamos por partes:

1. Windows Phone Developer Tools

Neste primeiro, você vai baixar um setup que realizará download e a instalação de praticamente tudo o que você precisa em termos de ferramenta: Visual Studio Express 2010 for Windows Phone, o Windows Phone Emulator, o Silverlight for Windows Phone, e o XNA 4.0 Game Studio. Caso você não tenha o .Net Framework 4.0, ele também será instalado no pacote.

Com este pacote, o Visual Studio já terá suporte para criar projetos tipo Windows Phone, Silverlight, XNA, etc.

2. Microsoft Expression Blend 4 Beta

3. Microsoft Expression Blend 4 for Windows Phone

Aqui você poderá criar novos projetos no Blend dos tipos Windows Phone 7.

5. Documentos:

Programando para Windows Phone 7 

Livro gratuito, inclui diversos códigos XAML, XNA e vários outros temas interessantes.

Application Platform Overview for Windows Phone

Material sobra a arquitetura de aplicações para o Windows Phone 7, isto é, a base que você deve entender para criar seus aplicativos.

Windows Phone UI Design and Interaction Guide

Trata-se do guia que define toda a padronização visual e de interação com o usuário para aplicativos do Windows Phone 7, desde o estilo de iconografia que deve ser utilizado até os cuidados para poder permitir uma boa utilização da tela de toque.

Designing Web Sites for Phone Browsers

Guia de como os desenvolvedores e designers devem pensar e adequar seus sites para poderem ter uma boa experiência no Internet Explorer do Windows Phone 7.

6. Download dos Códigos-fonte de Exemplo Oficiais

Aqui você encontra alguns projetos feitos para o Windows Phone 7 junto com o seu código fonte.

7. Vídeos das Sessões do MIX 10

Para quem deseja iniciar o desenvolvimento para o Windows Phone 7, de uma olhada nas sessões Building Windows Phone Applications with Silverlight, Part 1Building Windows Phone Applications with Silverlight, Part 2 , que são um passo a passo, do zero, para criação de aplicações na plataforma.

Valew galera era isso. Acredito que com o auxílio desses materiais já da pra se virar bem na plataforma.

Prometo trazer mais novidades!

O dispositivo em si é perfeito para jogos, com uma grande tela e mais poderoso que um PSP.
Então não perca tempo e começe aqui e aqui a criar seu jogo em XNA para o novo Windows Phone.

Estou preparando um passo-a-passo sobre isso, aguardem que ta ficando legal.

Até a próxima. Valew!

Meu 1º Jogo Escrito em XNA !!!

Publicado: 6 06UTC setembro 06UTC 2010 em Pessoal, XNA

Olá a todos!

Como vocês sabem há um tempinho atrás eu adquiri um livro sobre XNA. Então eu comecei a fazer algumas “coisinhas” com a ajuda dele.

Para quem se interessar estou disponibilizando o executavel do jogo que na verdade é um remake do Pong, é aquele mesmo que tinha no atari senão me engano.

Screenshouts do PongGame

O link do jogo.

PS: Para aqueles que não conseguirem rodar o jogo na primeira tentativa, será necessário executar o arquivo dotNetFx40_Full_setup.exe para fazer o download e instalação do runtime do .Net versão 4.0

Valew e até mais.

Nesse post falarei sobre um padrão arquitetural de apresentação bem específico ao WPF e Silverlight: o MVVM (Model-View-ViewModel).

O MVVM nasceu da necessidade de separarmos as responsabilidades na camada de apresentação, facilitando a vida da equipe de design gráfico com a redução de impactos nas alterações das Views e aumentando a testabilidade do sistema, por possuir naturalmente o domínio desacoplado da lógica de visualização.

O modelo de desenvolvimento de Rich Internet Application (RIA) proposto pela Microsoft compreende na colaboração entre dois tipos de equipe: designers e desenvolvedores. Com o advento do Expression Blend e das Application Programming Interface (APIs – ou Interface de Programação de Aplicações) de desenvolvimento WPF e Silverlight para .NET 3, 3.5 e 4, isto passou a ser possível de uma forma bem menos traumática e integrada. Mas o mercado exigia mais.

E aí entra o MVVM. Pense na idéia de isolar os designs das telas de qualquer fator de infra-estrutura, comunicação externa ou alguma dependência que impeça a continuidade dos layouts. Imagine que enquanto essas telas são feitas sua equipe de desenvolvimento pode projetar e desenvolver o domínio do sistema, onde a coisa pega e geralmente mora toda a complexidade do seu software, linhas e mais linhas de Line of Business (LoB), controle transacional orientado a aspectos, specifications, domain-specific language (DSLs) e toda aquela tropa. Você não vai querer isso no meio dos seus bindings, conversões e validações, vai?

Some isso ao fato de você poder testar seu domínio sem se preocupar com escrever longos testes de integração e User Interface Automation, que permeiam desde os code-behinds de seus XAML até suas classes de mapeamento relacional.

A idéia aqui é testar “a cola entre os dois mundos”, que por sinal se chama “ViewModel” (mundialmente conhecida e batizada pelo Fowler como Presentation Model). MVVM é só um nome bacana para aplicações que trabalham com marcações XAML. Tudo começou neste post do John Grossman, lá no início da era WPF & Silverlight.

Para falar a verdade, o MVVM se distingue do resto da família (MVC, MVP, Presentation Model, Mxxx …) por fatores tecnológicos bem específicos, como:

  • Uso dos DataBinds bi-direcionais e a interface INotifyPropertyChanged (do namespace System.ComponentModel) para disparar alterações nos modelos de visualização (ViewModels).
  • Conversão e formatação de valores através dos Converters (interface IValueConverter no System.Windows.Data).
  • Validação de valores integradas ao modelo de DataBinding da plataforma (ValidatesOnDataErrors = True) e ao Validation Application Block (da Enterprise Library).
  • Modelo de eventos utilizando a interface ICommand do namespace System.Windows.Input.

MVVM

O Model-View-ViewModel (ou MVVM) é um padrão de desenvolvimento de software (design pattern) baseado no famoso padrão MVC (Model-View-Controller), voltado para aplicações WPF e Silverlight, justamente pelo fato de ambas utilizarem o XAML como linguagem de design.

Quais as vantagens deste padrão sobre o MVC?

Ele trabalha bem com aplicações baseadas em XAML devido às suas grandes funcionalidades de binding (vinculação de dados), permitindo à View (camada de apresentação) ficar plenamente separada da camada de dados e da lógica de negócio. Permite também que a figura do designer de software atue o mais separado possível dos desenvolvedores, tendo o Expression Blend como seu maior aliado.

View (Camada de apresentação)

É composta de classes que representam a interface que o usuário verá. No Silverlight, um exemplo seria a classe MainPage.xaml. Cada classe contém os controles visuais que serão mostrados ao usuário, podendo conter também animações, aspectos de navegação, temas e outras funcionalidades interativas com o propósito da apresentação visual. Tanto no Silverlight quanto no WPF, as classes da View também contam com extensões de binding que identificam os dados que a serem apresentados ao usuário (embutidos no XAML). O binding aponta para o nome das propriedades de dados, mas não tem conhecimento de onde estas propriedades estão, nem de onde elas vieram. Os bindings são ativados quando o DataContext de uma classe da View é direcionado para outra (da camada de ViewModel) que contém a fonte para eles.

Model (Camada de Dados)

É representada por classes que representam os dados descrevendo uma entidade específica. Por exemplo, a classe Cliente com suas propriedades, tais como Nome, e Id. A classe de Model pode conter Models filhos também, permitindo que a classe Cliente possua filhos do tipo Compra. O propósito do Model é representar os dados, não tendo conhecimento de onde eles serão apresentados para um usuário, nem mesmo se eles serão mostrados. A simples responsabilidade é a representação.

ViewModel (Camada de vinculação)

É o elo entre a View e o Model. O DataContext da View é vinculado a uma instância de uma classe do ViewModel. É onde todos os bindings do XAML da View são declarados. O ViewModel contém o Model, então ele tem todos os dados que são necessários em diversos casos. O ViewModel pode também declarar propriedades públicas para comandos (maneiras de invocar ações da View para o ViewModel) e outras propriedades que podem ser vinculadas à View.

Estrutura de Arquivos

O projeto baseado em MVVM possui a seguinte estrutura conforme a figura abaixo. Lembrando que a mesma pode variar para cada projeto.

Estrutura da Aplicação

Note que a nossa solução possui quatro projetos.

- ExemploMVVM.Web: criado automaticamente, é o responsável por fazer nossa aplicação rodar no browser. Nesse caso em cima de uma página Asp.Net;

- ExemploMVVM: também criado automaticamente, é o responsável por chamar a nossa View (View.xaml);

- ExemploMVVM.UI: é onde criaremos a nossa View e a nossa ViewModel;

- ExemploMVVM.Model: é onde criaremos a nossa classe de modelos.

Em resumo quando se aplica o padrão a aplicações Silverlight ou WPF, a ligação dos Models é feita com a utilização de DataBinding e os eventos podem ser tratados utilizando-se Commands ou a API de Triggers do Expression Blend.

Analise a figura abaixo para visualizar melhor os três elementos do padrão:

Entendendo na Prática

Como o MVVM trabalha tanto com WPF e Silverlight, optei por um exemplo em Silverlight. O exemplo é o mais simples possível, visa somente o entendimento do padrão usado.

Vejamos a seguir:

- Crie um novo projeto. Optei pelo nome ExemploMVVM.

- Agora adicione mais dois projetos na solução, um Silverlight Class Libary (ExemploMVVM.Model) e o outro Silverlight Application (ExemploMVVM.UI).

- ExemploMVVM.Model: pode deletar o Class1.cs que ele adiciona automaticamente.

- ExemploMVVM.Model: crie uma pasta chamada Model e inclua na mesma uma nova class com o nome de Person.cs. Inclua o código abaixo nela.

Person.cs

using System.ComponentModel;
namespace ExemploMVVM.Model.Model
{
public class Person : INotifyPropertyChanged
{
#region Constructor
public Person()
{
}
#endregion
#region Public Properties
private string _name;
public string Name
{
get { return this._name; }
set
{
this._name = value;
this.NotifyPropertyChanged(“Name”);
}
}
private string _email;
public string Email
{
get { return this._email; }
set
{
this._email = value;
this.NotifyPropertyChanged(“Email”);
}
}
#endregion
#region NotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
}

Explicação do código: A classe de modelo possui as propriedades (Name e Email) e é uma classe que herda de INotifyPropertyChanged, esse último é o responsável por avisar a nossa View que o valor da propriedade mudou. Apenas isso é necessário na camada de modelo.

- ExemploMVVM.UI: pode deletar o MainPage.xaml e MainPage.cs criados automaticamente.

- ExemploMVVM. UI: agora crie duas novas pastas, View e ViewModel. Na pasta View adicione um Silverlight User Control com o nome de View.xaml e na pasta ViewModel adicione uma nova class com o nome de ViewModel.cs. Nesse projeto vá em References e adicione as seguintes dlls:

Por fim vá em references, na aba Projects e adicione o ExemploMVVM.Model.

- ExemploMVVM. UI: Inclua os seguintes códigos a elas.

ViewModel.cs

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using ExemploMVVM.Model.Model;
using Microsoft.Practices.Composite.Presentation.Commands;
namespace ExemploMVVM.UI.ViewModel
{
public class ViewModel : INotifyPropertyChanged
{
#region Constructor
public ViewModel()
{
this.People = new ObservableCollection<Person>();
this.AddCommand = new DelegateCommand<object>(ExecuteAddCommad);
this.ClearVariablesPerson();
}
#endregion
#region Private Methods
private void ExecuteAddCommad(object parameter)
{
if (string.IsNullOrEmpty(this.Name))
MessageBox.Show(“Campo nome em branco.”);
this.People.Add(new Person() { Name = this.Name, Email = this.Email });
this.ClearVariablesPerson();
}
private void ClearVariablesPerson()
{
this.Email = string.Empty;
this.Name = string.Empty;
}
#endregion
#region Public Properties
public ObservableCollection<Person> People { get; set; }
public DelegateCommand<object> AddCommand { get; set; }
private string _name;
public string Name
{
get { return this._name; }
set
{
this._name = value;
this.NotifyPropertyChanged(“Name”);
}
}
private string _email;
public string Email
{
get { return this._email; }
set
{
this._email = value;
this.NotifyPropertyChanged(“Email”);
}
}
#endregion
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
}

Explicação do código: Também é uma classe que herda de INotifyPropertyChanged, isso é necessário porque é a nossa classe responsável por fazer a ligação entre a Model e a View.

Repare que possuímos as propriedades Name e Email aqui também, são elas que estão bindadas (binding) com a nossa View. Possuímos uma coleção de Person que é nosso People. Mas se a coleção também está bindada a nossa View por que não há uma chamada para NotifyPropertyChanged?

É simples, como nossa coleção é uma ObservableCollection, não há a necessidade. Entenda assim, por baixo dos “panos” ele também faz uma chamada a NotifyPropertyChanged.

Por último temos nosso comando, que é o responsável por adicionar os itens à coleção.

View.xaml

<UserControl xmlns:sdk=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data”  x:Class=”ExemploMVVM.UI.View.View”
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″
xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″
xmlns:viewModel=”clr-namespace:ExemploMVVM.UI.ViewModel”
mc:Ignorable=”d”
d:DesignHeight=”300″ d:DesignWidth=”400″>
<UserControl.Resources>
<viewModel:ViewModel x:Name=”myViewModel”/>
</UserControl.Resources>
<Grid x:Name=”LayoutRoot” Background=”White” DataContext=”{StaticResource myViewModel}” Width=”600″ HorizontalAlignment=”Center”>
<Grid.RowDefinitions>
<RowDefinition Height=”Auto”/>
<RowDefinition Height=”Auto”/>
<RowDefinition Height=”Auto”/>
<RowDefinition Height=”Auto”/>
</Grid.RowDefinitions>
<sdk:DataGrid x:Name=”myGrid” ItemsSource=”{Binding People}” Height=”400″ HorizontalAlignment=”Stretch” Margin=”5″/>
<StackPanel Orientation=”Horizontal” Grid.Row=”1″ Margin=”5″>
<TextBlock Text=”Nome: “/>
<TextBox Text=”{Binding Name, Mode=TwoWay}” Width=”300″ Height=”25″/>
</StackPanel>
<StackPanel Orientation=”Horizontal” Grid.Row=”2″ Margin=”5″>
<TextBlock Text=”Email: “/>
<TextBox Text=”{Binding Email, Mode=TwoWay}” Width=”300″ Height=”25″/>
</StackPanel>
<Button Content=”Adicionar” Command=”{Binding AddCommand}” Grid.Row=”3″ Width=”100″ Height=”30″ Margin=”5″/>
</Grid>
</UserControl>

Explicação do código: <viewModel:ViewModel x:Name=”myViewModel”/> aqui é onde nós dizemos a View quem é a nossa ViewModel e em DataContext=”{StaticResource myViewModel}” é definido como DataContext nossa ViewModel. O restante do código é simplesmente os bindings para nossas propriedades.

- ExemploMVVM:  Vá em References, na aba Projects, inclua ExemploMVVM.UI. No MainPage.xaml inclua o seguinte código:

MainPage.xaml

<UserControl x:Class=”ExemploMVVM.MainPage”
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″
xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″
xmlns:view=”clr-namespace:ExemploMVVM.UI.View;assembly=ExemploMVVM.UI”
mc:Ignorable=”d”
d:DesignHeight=”300″ d:DesignWidth=”400″>
<Grid x:Name=”LayoutRoot” Background=”White”>
<view:View/>
</Grid>
</UserControl>

Explicação do código: Aqui não há mistério algum, simplesmente dada a referência para a nossa View, apenas estamos dizendo ao MainPage para mostrá-la.

A solução completa pode ser baixada aqui.

Espero que tenha ajudado a todos.

Valew e prometo trazer mais novidades.

Finalmente comprei, já vinha a tempo namorando esse livro, criei coragem e comprei!!!

Xna 3.0: Para Desenvolvimento de Jogos no Windows, Zune e Xbox 360

Agora é estudar e quem sabe trago mais novidades.

Valew!

Seguindo a dica do meu último post, resolvi testar o desenvolvimento para o Windows Phone 7. Apesar de eu estar começando, eu achei bem interessante. Vamos lá então!

Você pode baixar o Kit para Desenvolvimento e começar a fazer os primeiros testes.

Quanto você baixa e instala o Kit, ele adiciona um novo template para desenvolvimento quando você cria um novo projeto:

Inicialmente o template só está disponível para a linguagem C#.

Para este exemplo, iremos escolher Windows Phone Application e vamos manter o nome padrão da solução. Criei a aplicação para ser usada com Silverlight, ela também está disponível para XNA, mas com esse tenho que me famializar ainda.

Feito isto teremos a tela do designer da aplicação:


A partir daí o desenvolvimento é todo em Silverlight, como você pode ver, ao lado direito da tela está o código XAML. Vamos colocar somente um botão e um label e executar nossa aplicação:

Executando a aplicação (F5), o emulador é aberto e você pode testá-la:

Não vou criar nenhuma ação ainda, vou postar sobre o padrão de desenvolvimento (MVVM – Model, View e ViewModel) usando no Silverlight antes disso, depois disso criarei uma aplicação completa para Windows Phone.

O emulador ainda é bastante simples, se comparado ao emulador do Windows Mobile, mas para você testar as suas primeira aplicações  e ir se familiarizando com o novo ambiente está muito bom.

Para finalizar, acredito que este é um passo interessante para o desenvolvimento com a plataforma .Net e também uma maneira de padronizar o desenvolvimento para dispositivos móveis, e usando Silverlight fica muito mais interessante ainda.

Espero que eu tenha despertado a curiosidade em vocês. Eu volto com muito mais.