Diferença entre SelectedItem, SelectedValue e SelectedValuePath

351

Qual é a diferença entre o seguinte:

Todas essas propriedades de dependência são definidas na classe Selector . Costumo confundir SelectedItemcom SelectedValuee SelectedValuecom SelectedValuePath.

Gostaria de saber a diferença entre eles e também quando os usamos, especialmente SelectedValuee SelectedValuePath. Por favor, explique seu uso com alguns exemplos simples.

Nawaz
fonte
3
Bea tem um post com a explicação e código de exemplo que você pode baixar ... bea.stollnitz.com/blog/?p=9
Aaron McIver
2
possível repetição de [confundido com WPF caixa de combinação DisplayMemberPath, SelectedValue e SelectedValuePath] ( stackoverflow.com/questions/3797034/... )

Respostas:

552

Seus nomes podem ser um pouco confusos :). Aqui está um resumo:

  • A propriedade SelectedItem retorna o objeto inteiro ao qual sua lista está vinculada. Digamos que você vinculou uma lista a uma coleção de Categoryobjetos (com cada objeto Categoria com propriedades Nome e ID). por exemplo. ObservableCollection<Category>. A SelectedItempropriedade retornará o Categoryobjeto selecionado no momento . Para fins de ligação, no entanto, isso nem sempre é o que você deseja, pois isso só permite vincular um objeto Category inteiro à propriedade à qual a lista está vinculada, e não o valor de uma única propriedade nesse objeto Category (como sua IDpropriedade )

  • Portanto, temos a propriedade SelectedValuePath e a propriedade SelectedValue como um meio alternativo de ligação (você as utiliza em conjunto). Digamos que você tenha um Productobjeto ao qual sua visualização esteja vinculada (com propriedades para itens como NomeDoProduto, Peso etc.). Digamos também que você tenha uma CategoryIDpropriedade nesse objeto Produto e deseje que o usuário possa selecionar uma categoria para o produto em uma lista de categorias. Você precisa que a propriedade ID do objeto Categoria seja atribuída à CategoryIDpropriedade no objeto Produto. É aqui que o SelectedValuePathe oSelectedValueas propriedades entram. Você especifica que a propriedade ID no objeto Categoria deve ser atribuída à propriedade no objeto Produto que a lista está vinculada a usar SelectedValuePath='ID'e, em seguida, vincula a SelectedValuepropriedade à propriedade no DataContext (ou seja, o Produto).

O exemplo abaixo demonstra isso. Temos uma ComboBox vinculada a uma lista de categorias (via ItemsSource). Estamos vinculando a propriedade CategoryID no produto como o valor selecionado (usando a propriedade SelectedValue). Estamos relacionando isso à propriedade ID da categoria por meio da propriedade SelectedValuePath. E estamos dizendo apenas exibir a propriedade Name na ComboBox, com a propriedade DisplayMemberPath).

<ComboBox ItemsSource="{Binding Categories}" 
          SelectedValue="{Binding CategoryID, Mode=TwoWay}" 
          SelectedValuePath="ID" 
          DisplayMemberPath="Name" />
public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Product
{
    public int CategoryID { get; set; }
}

É um pouco confuso inicialmente, mas espero que isso torne um pouco mais claro ... :)

Chris

Chris Anderson
fonte
8
Obrigada pelo esclarecimento. Você é o mesmo cara que escreveu um livro sobre o Silverlight? Eu não acredito que estou falando com você. : -) ... eu estou lendo este livro hoje em dia. Realmente um trabalho incrível. :-)
Nawaz 04/02
22
Sim, sou eu :). Eu ando por aqui aqui para responder perguntas quando posso. Que bom que você está gostando do livro :). Desde que você adquiriu o livro, você encontrará mais informações sobre este tópico nas páginas 69-70 e página 204.
Chris Anderson
8
+1. +100. Você, senhor, é um deus de ouro entre os homens inferiores. Que Deus te abençoe, e todos os que navegam em você. :) Sério, eu passei duas horas tentando descobrir isso - obrigado!
TarkaDaal
11
@ Chris Anderson: E se o objeto Product tiver uma propriedade Category (tipo Category) em vez de um CategoryID? Como posso atualizar esta propriedade Category na alteração do ComboBox através da ligação?
Lucifer
2
@ Lucifer: Nesse caso, você usaria a propriedade SelectedItem da seguinte maneira: <ComboBox ItemsSource = "{Categorias de Ligação}" SelectedItem = "{Categoria de Ligação, Modo = Duas Vias}" /> Espero que isso ajude.
Chris Anderson
69

Para responder um pouco mais conceitualmente:

SelectedValuePathdefine qual propriedade (pelo nome) dos objetos vinculados aos ListBox ItemsSourceserá usada como item SelectedValue.

Por exemplo, se a sua listagem está vinculado a uma coleção de Personobjetos, cada um dos quais tem Name, Agee Genderpropriedades, SelectedValuePath=Namefará com que o valor do selecionado Personda Namepropriedade a ser devolvido nos SelectedValue.

Observe que, se você substituir o ControlTemplate do ListBox (ou aplicar um estilo) que especifique qual propriedade deve ser exibida, SelectedValuePathnão poderá ser usado.

SelectedItem, enquanto isso, retorna todo o Person objeto selecionado no momento.

(Veja mais um exemplo do MSDN , usando o TreeView)

Atualizar: Como apontou @Joe, a propriedade DisplayMemberPath não está relacionada às propriedades Selected *. Sua descrição adequada é a seguinte:

Observe que esses valores são diferentes de DisplayMemberPath(que é definido no ItemsControl, não no Selector), mas essa propriedade possui um comportamento semelhante ao SelectedValuePath: na ausência de um estilo / modelo, identifica qual propriedade do objeto vinculado ao item deve ser usada como sua representação de string.

Dan J
fonte
8

SelectedItemé um object. SelectedValuee SelectedValuePathsão strings.

por exemplo, usando o ListBox:

se você me der listbox1.SelectedValue, retornará o texto do item atualmente selecionado.

string value = listbox1.SelectedValue;

se você me der, listbox1.SelectedItemisso lhe dará todo o objeto.

ListItem item = listbox1.SelectedItem;
string value = item.value;
capdragon
fonte
3
SelectedValuetambém é um objecte não um string. Pls veja aqui
john_m
5

inspirado por esta pergunta, escrevi um blog junto com o trecho de código aqui . Abaixo estão alguns trechos do blog

SelectedItem - Item Selecionado ajuda a vincular o valor real do DataSource que será exibido. Este é do tipo objeto e podemos vincular qualquer tipo derivado do tipo de objeto a essa propriedade. Como usaremos a ligação MVVM para nossas caixas de combinação, nesse caso, essa é a propriedade que podemos usar para notificar à VM que o item foi selecionado.

SelectedValue e SelectedValuePath - Essas são as duas propriedades mais confusas e mal interpretadas da caixa de combinação. Mas essas propriedades são resgatadas quando queremos vincular nossa caixa de combinação com o valor do objeto já criado. Verifique meu último cenário na lista a seguir para ter uma breve idéia sobre as propriedades.

Vikram
fonte
1

Todo controle que usa Coleções para armazenar dados possui a propriedade SelectedValue, SelectedItem. Exemplos desses controles são ListBox, Dropdown, RadioButtonList, CheckBoxList.

Para ser mais específico, se você deseja literalmente recuperar o texto do item selecionado, pode escrever:

ListBox1.SelectedItem.Text;

Seu ListBox1 também pode retornar Texto usando a propriedade SelectedValue se o valor já tiver sido definido antes. Mas acima, é uma maneira mais eficaz de obter texto.

Agora, o valor é algo que não é visível para o usuário, mas é usado principalmente para armazenar no banco de dados. Não inserimos o texto do ListBox1, no entanto, também podemos inseri-lo, mas costumávamos inserir o valor do item selecionado. Para obter valor, podemos usar

ListBox1.SelectedValue

Fonte

kamalpreet
fonte