Encontrar item no WPF ComboBox
-
09-06-2019 - |
Pergunta
Eu sei que no ASP.NET posso obter um item de um DropDownList usando
DropDownList1.Items.FindByText
Existe um método semelhante que posso usar no WPF para um ComboBox?
Aqui está o cenário.
Tenho uma tabela chamada RestrictionFormat que contém uma coluna chamada RestrictionType, o tipo é uma chave estrangeira para uma tabela que armazena esses valores.
No meu aplicativo editor que estou escrevendo, quando o usuário seleciona RestrictionFormat em um ComboBox (isso funciona bem), estou puxando os detalhes para edição.Estou usando um segundo ComboBox para garantir que o usuário selecione apenas um RestrictionType ao editar.Já tenho a segunda propriedade vinculada à caixa de combinação da tabela RestrictionType, mas preciso alterar o índice selecionado nela para corresponder ao valor especificado no registro.
Aqui está o cenário.
Tenho uma tabela chamada RestrictionFormat que contém uma coluna chamada RestrictionType, o tipo é uma chave estrangeira para uma tabela que armazena esses valores.
No meu aplicativo editor que estou escrevendo, quando o usuário seleciona RestrictionFormat em um ComboBox (isso funciona bem), estou puxando os detalhes para edição.Estou usando um segundo ComboBox para garantir que o usuário selecione apenas um RestrictionType ao editar.Já tenho a segunda propriedade vinculada à caixa de combinação da tabela RestrictionType, mas preciso alterar o índice selecionado nela para corresponder ao valor especificado no registro.
Isso faz sentido?
Solução
Você pode usar o ItemContainerGenerator?
ItemContainerGenerator contém um método ContainerFromItem que usa um parâmetro de objeto.Se você tiver uma referência ao objeto completo que seu comboBox contém (ou uma forma de reconstruí-lo), você pode usar o seguinte:
ComboBoxItem item =
(ComboBoxItem)myComboBox.ItemContainerGenerator.ContainerFromItem(myObject);
Outras dicas
No WPF você pode usar o método FindName.
XAML:
<ComboBox Name="combo">
<ComboBoxItem Name="item1" >1</ComboBoxItem>
<ComboBoxItem Name="item2">2</ComboBoxItem>
<ComboBoxItem Name="item3">3</ComboBoxItem>
</ComboBox>
Arquivo code-behind
item1.Content = "New content"; // Reference combo box item by name
ComboBoxItem item = (ComboBoxItem)this.combo.FindName("item1"); // Using FindName method
Para encontrar o item pelo seu conteúdo, você pode usar Automação da IU.
em vez de tentar vincular o SelectedIndex, por que você simplesmente não vincula o SelectedItem no ComboBox ao valor no registro?
em outras palavras, defina o DataContext do ComboBox (ou seu pai) para o 'registro' selecionado e vincule o SelectedItem no ComboBox a uma propriedade exposta no 'registro'.
pode ajudar se você fornecer alguns trechos de código ou detalhes extras para que as respostas possam ser mais específicas e se referir às variáveis e tipos que você está usando no registro de origem e no ComboBox que você preencheu.
Você pode recuperar itens da caixa de combinação de duas maneiras:
Por item:
ComboBoxItem item = (ComboBoxItem) control.ItemContainerGenerator.ContainerFromItem(control.SelectedItem);
Por índice:
ComboBoxItem item = (ComboBoxItem) control.ItemContainerGenerator.ContainerFromIndex(1);
Você pode fornecer algum contexto sobre o que exatamente você está tentando fazer?
Quais objetos você coloca no seu Combobox e usando qual método?(Você está definindo ou vinculando a propriedade Itens Source?) Por que você precisa procurar um item por seu "texto"?O uso mais comum no WPF é vincular a propriedade SelectedItem a outra coisa para que você possa recuperar/definir a entrada selecionada usando sua representação.Existe um requisito específico para o qual você precisa encontrar um item específico na lista?
Na pior das hipóteses, você pode realizar a pesquisa na coleção à qual você vincula seu ComboBox usando Linq To Objects.
Não confunda o ComboBoxItem (ou seja, o elemento gerado para você nos bastidores pelo WPF quando você vincula ItemsSource) com o SelectedItem, que é o objeto real na coleção à qual você vincula.Essa geralmente é a fonte da maioria dos problemas com o WPF quando você não está acostumado.Existem poucos casos em que você precisa encontrar o ComboBoxItem real.