Diferencia entre SelectedItem, SelectedValue y SelectedValuePath

352

¿Cuál es la diferencia entre lo siguiente?

Todas estas propiedades de dependencia se definen en la clase Selector . A menudo confundo SelectedItemcon SelectedValuey SelectedValuecon SelectedValuePath.

Me gustaría saber la diferencia entre ellos, y también cuándo los usamos, especialmente SelectedValuey SelectedValuePath. Por favor explique su uso con algunos ejemplos simples.

Nawaz
fuente
3
Bea tiene una publicación de blog con explicación y código de muestra que puede descargar ... bea.stollnitz.com/blog/?p=9
Aaron McIver
2
posible duplicado de [Confundido con wpf ComboBox DisplayMemberPath, SelectedValue y SelectedValuePath] ( stackoverflow.com/questions/3797034/… )

Respuestas:

552

Sus nombres pueden ser un poco confusos :). Aquí hay un resumen:

  • La propiedad SelectedItem devuelve todo el objeto al que está vinculada su lista. Supongamos que ha vinculado una lista a una colección de Categoryobjetos (cada objeto de Categoría tiene propiedades de Nombre e ID). p.ej. ObservableCollection<Category>. La SelectedItempropiedad le devolverá el Categoryobjeto seleccionado actualmente . Sin embargo, para fines vinculantes, esto no siempre es lo que desea, ya que esto solo le permite vincular un objeto Categoría completo a la propiedad a la que está vinculada la lista, no el valor de una sola propiedad en ese objeto Categoría (como su IDpropiedad )

  • Por lo tanto, tenemos la propiedad SelectedValuePath y la propiedad SelectedValue como un medio alternativo de vinculación (las usa conjuntamente). Supongamos que tiene un Productobjeto al que está vinculada su vista (con propiedades para cosas como ProductName, Weight, etc.). Supongamos también que tiene una CategoryIDpropiedad en ese objeto Producto y desea que el usuario pueda seleccionar una categoría para el producto de una lista de categorías. Necesita que la propiedad ID del objeto Categoría se asigne a la CategoryIDpropiedad en el objeto Producto. Aquí es donde el SelectedValuePathy elSelectedValueentran las propiedades. Usted especifica que la propiedad ID en el objeto Categoría debe asignarse a la propiedad en el objeto Producto que la lista está obligada a usar SelectedValuePath='ID', y luego vincula la SelectedValuepropiedad a la propiedad en el DataContext (es decir, el Producto).

El siguiente ejemplo demuestra esto. Tenemos un ComboBox vinculado a una lista de Categorías (a través de ItemsSource). Vinculamos la propiedad CategoryID en el Producto como el valor seleccionado (usando la propiedad SelectedValue). Estamos relacionando esto con la propiedad de ID de la categoría a través de la propiedad SelectedValuePath. Y estamos diciendo que solo muestre la propiedad Name en ComboBox, con la propiedad 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; }
}

Al principio es un poco confuso, pero espero que esto lo haga un poco más claro ... :)

Chris

Chris Anderson
fuente
8
Gracias por la explicación. ¿Eres el mismo tipo que ha escrito un libro sobre Silverlight? No creo que te esté hablando. : -) ... Estoy leyendo este libro hoy en día. Realmente un trabajo increíble. :-)
Nawaz
22
Sí, ese soy yo :). Me quedo con estas partes aquí para responder preguntas cuando puedo. Me alegro de que estés disfrutando el libro :). Ya que tiene el libro, encontrará más información sobre este tema en las páginas 69-70 y en la página 204.
Chris Anderson,
8
+1. +100. Usted, señor, es un dios dorado entre los hombres menores. Que Dios te bendiga y todos los que navegan en ti. :) En serio, acabo de pasar dos horas tratando de resolverlo, ¡gracias!
TarkaDaal
1
@ Chris Anderson: ¿Qué sucede si el objeto Producto tiene una propiedad Categoría (tipo Categoría) en lugar de un IdCategoría? ¿Cómo puedo actualizar esta propiedad de Categoría en el cambio de ComboBox a través del enlace?
Lucifer
2
@Lucifer: en este caso usaría la propiedad SelectedItem de la siguiente manera: <ComboBox ItemsSource = "{Binding Categories}" SelectedItem = "{Binding Category, Mode = TwoWay}" /> Espero que esto ayude.
Chris Anderson
69

Para responder un poco más conceptualmente:

SelectedValuePathdefine qué propiedad (por su nombre) de los objetos vinculados a ListBox ItemsSourcese utilizará como elemento SelectedValue.

Por ejemplo, si el cuadro de lista se une a una colección de Personobjetos, cada uno de los cuales tiene Name, Agey Genderpropiedades, SelectedValuePath=Namehará que el valor de los seleccionados Person's Namepropiedad a ser devuelto en SelectedValue.

Tenga en cuenta que si anula la ControlTemplate de ListBox (o aplica un Estilo) que especifica qué propiedad debe mostrarse, SelectedValuePathno se puede utilizar.

SelectedItem, mientras tanto, devuelve todo el Personobjeto actualmente seleccionado.

(Aquí hay otro ejemplo de MSDN , usando TreeView)

Actualización: como señaló @Joe, la propiedad DisplayMemberPath no está relacionada con las propiedades Seleccionadas *. Su descripción apropiada sigue:

Tenga en cuenta que estos valores son distintos de DisplayMemberPath(que se define en ItemsControl, no Selector), pero esa propiedad tiene un comportamiento similar a SelectedValuePath: en ausencia de un estilo / plantilla, identifica qué propiedad del objeto vinculado al elemento debe usarse como su Representación de cadena.

Dan J
fuente
8

SelectedItemes un object. SelectedValuey SelectedValuePathson strings.

por ejemplo usando el ListBox:

si dices dame listbox1.SelectedValue, devolverá el texto del elemento seleccionado actualmente.

string value = listbox1.SelectedValue;

si dices dame listbox1.SelectedItem, te dará el objeto completo.

ListItem item = listbox1.SelectedItem;
string value = item.value;
Capdragon
fuente
3
SelectedValuetambién es un objecty no un string. Por
favor
5

inspirado por esta pregunta, he escrito un blog junto con el fragmento de código aquí . A continuación se presentan algunos extractos del blog.

SelectedItem: el elemento seleccionado ayuda a vincular el valor real de DataSource que se mostrará. Este es de tipo objeto y podemos vincular cualquier tipo derivado del tipo de objeto con esta propiedad. Dado que usaremos el enlace MVVM para nuestros cuadros combinados en ese caso, esta es la propiedad que podemos usar para notificar a VM que el elemento ha sido seleccionado.

SelectedValue y SelectedValuePath: estas son las dos propiedades más confusas y mal interpretadas para el cuadro combinado. Pero estas propiedades vienen a rescatarnos cuando queremos vincular nuestro cuadro combinado con el valor del objeto ya creado. Consulte mi último escenario en la siguiente lista para tener una breve idea sobre las propiedades.

Vikram
fuente
1

Cada control que usa Colecciones para almacenar datos tiene SelectedValue, SelectedItem propiedad. Ejemplos de estos controles son ListBox, Dropdown, RadioButtonList, CheckBoxList.

Para ser más específico si literalmente desea recuperar el texto del elemento seleccionado, puede escribir:

ListBox1.SelectedItem.Text;

Su ListBox1 también puede devolver texto usando la propiedad SelectedValue si el valor se ha establecido anteriormente. Pero arriba es una forma más efectiva de obtener texto.

Ahora, el valor es algo que no es visible para el usuario, pero se usa principalmente para almacenar en la base de datos. No insertamos el texto de ListBox1, sin embargo, también podemos insertarlo, pero solíamos insertar el valor del elemento seleccionado. Para obtener valor podemos usar

ListBox1.SelectedValue

Fuente

kamalpreet
fuente