Category Archives: C#

#01 – C# – Classes – ObservableCollection

Magia das Classes #2 : Overview

Saga :: M&M (Mundo Mobile)

Quando desenvolvemos é comum trabalhar com coleções de objetos, ou definindo os dados de um ComboBox, ou um DataGrid, é uma tarefa comum por exemplo criar métodos que retornam um List<T>.

Definição

Para quem conhece o Silverlight ou Serviços, deve ter visto a classe ObservableCollection<T>, ela fornece notificações, quando a collection é modificada, incluindo, alterando e excluindo algum item.

Quer uma vantagem? Suponha definir uma lista como fonte de dados de um DataGrid, e quando for adicionar qualquer item na colection, o DataGrid é atualizado automaticamente, o que não irá acontecer quando trabalhamos com List<T>.

A Localização

Fisicamente, estou localizado no System.Collections.ObjectModel. Então, quando precisar é só chamar que atenderei as suas necessidades.

netfw_observablecollection

Note que esta classe é uma coleção de dados de classe de base que implementa a interface INotifyCollectionChanged, bem como a interface INotifyPropertyChanged. Ela também suporta a  Collection, definido derivando da classe Collection <T>.

Chega de Teoria!

Deixando um pouco de lado o lado teórico, vamos agora para o lado prático.

A classe Cliente

Aqui irei criar duas classes, a classe Cliente.

public class Cliente
{
    public string Id { get; set; }    
    public string Nome { get; set; }
    public string Email { get; set; }

    public ObservableCollection<Cliente> ObterClientes()
    {
        return new ObservableCollection<Cliente>
                   {
                       new Cliente {Id=01, Nome = "Cliente A ", Email = "E-mail 01"},
                       new Cliente { Id=02,Nome = "Cliente B", Email = "E-mail 02"},
                       new Cliente { Id=03,Nome = "Cliente C", Email = "E-mail 03"},
                       new Cliente { Id=04,Nome = "Cliente D", Email = "E-mail 04"}
                   };
    }
}

A minha classe possui um método que retorna um ObservableCollection<Cliente>.

classe Produto

A classe Produto.

public class Produto
{
    public string Nome { get; set; }
    public string Marca { get; set; }

    public List<Produto> ObterProdutos()
    {
        return new List<Produto>
                   {
                       new Produto {Nome = "Produto 01", Marca = "Marca 01"},
                       new Produto {Nome = "Produto 02", Marca = "Marca 02"},
                       new Produto {Nome = "Produto 03", Marca = "Marca 03"},
                       new Produto {Nome = "Produto 06", Marca = "Marca 04"}
                   };
    }
}

Até aqui nada demais, apenas uma classe com um método que retorna um List<Produto>.

Para testar, criei uma app WPF, onde temos dois DataGrid, onde irei carregar as collections, e dois botões incluir, para adicionar um novo item na collection.

No form crie duas instâncias privadas, onde irei armazenar cada uma das listas. Estas listas que irei adicionar os novos registros.

private ObservableCollection<Cliente> clientes;
private List<Produto> produtos;

Evento Click Carregar

Agora no botão Carregar de cada um dos DataGrids, implemente:

private void Carregar_Click(object sender, RoutedEventArgs e)
{
    clientes = new Cliente().ObterClientes();
    Clientes.ItemsSource = clientes;
}

private void CarregarProdutos_Click(object sender, RoutedEventArgs e)
{
    produtos = new Produto().ObterProdutos();
    Produtos.ItemsSource = produtos;
}

Evento Click Incluir

Agora no botão Incluir de cada um dos DataGrids, implemente:

private void Incluir_Click(object sender, RoutedEventArgs e)
{
    clientes.Add(new Cliente{Nome = "Novo cliente", Email="Novo e-mail"});
}

private void IncluirProduto_Click(object sender, RoutedEventArgs e)
{
    produtos.Add(new Produto{Nome = "Novo produto", Marca = "Nova marca"});
}

Aqui estou adicionando um novo item em cada uma das coleções.

Linha de Raciocínio

netfw_observablecollection_exemplo

Note que em momento algum, após adicionar um novo item, eu falo que o DataGrid recebe a coleção novamente, e no DataGrid que recebe a ObservableCollection<Cliente> ele será automaticamente atualizado, e isto NÃO ocorre com o DataGrid que recebe List<Produto>.