Diferencia entre SelectedItem, SelectedValue y SelectedValuePath

Cuál es la diferencia entre lo siguiente:

  • Item seleccionado
  • SelectedValue
  • SelectedValuePath

Todas estas propiedades de dependencia se definen en la clase Selector . A menudo confundo SelectedItem con SelectedValue y SelectedValue con SelectedValuePath .

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

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

  • La propiedad SelectedItem devuelve el objeto completo al que está vinculada su lista. Por lo tanto, supongamos que ha vinculado una lista a una colección de objetos de Category (con cada objeto de Categoría con nombre y propiedades de ID). p.ej. ObservableCollection . La propiedad SelectedItem le devolverá el objeto Category seleccionado actualmente. No obstante, para fines vinculantes, esto no siempre es lo que desea, ya que esto solo 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 ID propiedad).

  • Por lo tanto, tenemos la propiedad SelectedValuePath y la propiedad SelectedValue como un medio alternativo de enlace (los utiliza conjuntamente). Supongamos que tiene un objeto Product que está sujeta su vista (con propiedades para elementos como ProductName, Weight, etc.). Supongamos también que tiene una propiedad de ID de CategoryID en ese objeto Producto y desea que el usuario pueda seleccionar una categoría para el producto de una lista de categorías. Necesita la propiedad ID del objeto Categoría que se asignará a la propiedad ID de CategoryID en el objeto Producto. Aquí es donde entran en SelectedValue propiedades SelectedValuePath y SelectedValue . Especifica que la propiedad ID en el objeto Category debe asignarse a la propiedad en el objeto Product al que está vinculada la lista utilizando SelectedValuePath='ID' , y luego enlazar el SelectedValue propiedad 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). Estamos vinculando la propiedad de CategoryID en el Producto como el valor seleccionado (utilizando la propiedad SelectedValue). Estamos relacionando esto con la propiedad ID de la categoría a través de la propiedad SelectedValuePath. Y solo decimos que muestra la propiedad Name en el ComboBox, con la propiedad DisplayMemberPath).

  

Al principio es un poco confuso, pero espero que esto lo aclare un poco … 🙂

Chris

Para responder un poco más conceptualmente:

SelectedValuePath define qué propiedad (por su nombre) de los objetos vinculados a ItemsSource de ListBox se utilizará como SelectedValue del elemento.

Por ejemplo, si su ListBox está vinculado a una colección de objetos Person , cada uno de los cuales tiene propiedades de Name , Age y Gender , SelectedValuePath=Name hará que el valor de la propiedad Name de la Person seleccionada sea devuelto en SelectedValue .

Tenga en cuenta que si reemplaza la plantilla ControlTemplate de ListBox (o aplica un estilo) que especifica qué propiedad debe mostrarse, no se puede usar SelectedValuePath .

SelectedItem , mientras tanto, devuelve todo el objeto Person 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 se debe utilizar como su representación de cadena

SelectedItem es un object . SelectedValue y SelectedValuePath son string s.

por ejemplo, usando el ListBox:

si dices give me 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; 

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

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

SelectedValue y SelectedValuePath: estas son las dos propiedades más confusas y malinterpretadas para el cuadro combinado. Pero estas propiedades vienen a rescatar cuando queremos unir nuestro combobox con el valor del objeto ya creado. Verifique mi último escenario en la siguiente lista para obtener una breve idea sobre las propiedades.

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

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

 ListBox1.SelectedItem.Text; 

Su ListBox1 también puede devolver texto utilizando la propiedad SelectedValue si el valor se ha configurado con anterioridad. 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