sexta-feira, 17 de junho de 2011

Combo Box no WPF – Propriedades DisplayMemberPath e SelectedValuePath

                Muitas vezes queremos fazer um combo box onde mostraremos para o usuário um valor, mas internamente queremos utilizar outro. O combo box do WPF oferece uma forma muito fácil de fazer isso usando duas propriedades DisplayMemberPath e o SelectedValuePath.
                Abaixo segue o trecho do XAML do combo box, este combo box vai retornar o nome de alguns fabricantes:

<combobox displaymemberpath="ds_Fabricante" height="24" isenabled="True" itemssource="{Binding}" margin="92,0,66,200" name="cbFabricante" selectedvaluepath="cd_Id" selectionchanged="cbFabricante_SelectionChanged_1" verticalalignment="Bottom">
</combobox>
                Destaco as propriedades ItemsSource, onde coloquei o valor {Binding}, isso para que eu possa colocar dentro do código a chamada para a procedure que vai carregar este combo box, na propriedade DisplayMemberPath eu coloco o nome do campo que eu quero que apareça para o usuário(no caso o nome do fabricante do equipamento – ds_Fabricante) e na propriedade SelectedValuePath eu coloco o nome do campo que eu quero utilizar dentro do meu programa(cd_Id é o código do fabricante na tabela).
                Agora segue o código que coloquei para alimentar o combo box:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
  using (SqlConnection conexao = new SqlConnection(@"String de Conexão com o Banco de dados"))
  {
    DataSet ds = new DataSet();
    SqlCommand cmd = new SqlCommand("exec pro_getFabricante", conexao);
    SqlDataAdapter sqlDA = new SqlDataAdapter(cmd);
    sqlDA.Fill(ds);
    cbFabricante.DataContext = ds.Tables[0].DefaultView;
    }
  }

                Está procedure está sendo executada no evento Loaded do formulário, no SqlCommand repare que eu executo uma procedure que está no banco de dados, está procedure pode ser substituída por um select e depois, na ultima linha, preencho o DataContext do combo box com o retorno da procedure. Segue a imagem de como fica o combo box:



                Para pegar o valor selecionado no combo box segue o código que foi configurado no evento SelectionChanged (este evento ocorre sempre que o valor do combobox for alterado)  e a imagem do alerta exibido:
private void cbFabricante_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
  MessageBox.Show("Código selecionado: " + cbFabricante.SelectedValue); 
}


Referencias:
Documentação da Microsoft (ComboClass)
Stackoverflow -Binding WPF ComboBox to a Custom List
C# Corner - WPF ComboBox
Macoratti - WPF - Preenchendo uma Combobox