Diferencia entre SelectedItem, SelectedValue y SelectedValuePath

Resuelto Sarfaraz Nawaz asked hace 13 años • 5 respuestas

¿Cuál es la diferencia entre lo siguiente?

  • Item seleccionado
  • Valor seleccionado
  • Ruta del valor seleccionado

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. Explique su uso con algunos ejemplos sencillos.

Sarfaraz Nawaz avatar Feb 05 '11 02:02 Sarfaraz Nawaz
Aceptado

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

  • La propiedad SelectedItem devuelve el objeto completo 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 medio alternativo de vinculación (se usan conjuntamente). Digamos que tiene un Productobjeto al que está vinculada su vista (con propiedades para cosas como Nombre del Producto, Peso, etc.). Digamos 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 del objeto Producto. Aquí es donde entran en juego SelectedValuePathlas propiedades y SelectedValue. Usted especifica que la propiedad ID en el objeto Categoría debe asignarse a la propiedad en el objeto Producto que la lista está vinculada a usar SelectedValuePath='ID'y luego vincula la SelectedValuepropiedad a la propiedad en 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 CategoryID en el Producto como el valor seleccionado (usando la propiedad SelectedValue). Estamos relacionando esto con la propiedad ID de la categoría a través de la propiedad SelectedValuePath. Y estamos diciendo que solo se muestre la propiedad Nombre en el 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 aclare un poco... :)

cris

Chris Anderson avatar Feb 04 '2011 20:02 Chris Anderson

Para responder un poco más conceptualmente:

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

Por ejemplo, si su ListBox está vinculado a una colección de Personobjetos, cada uno de los cuales tiene propiedades Name, Agey Gender, SelectedValuePath=Namehará que el valor de la propiedad seleccionada Personse Namedevuelva en SelectedValue.

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

SelectedItem, mientras tanto, devuelve el Personobjeto completo 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 adecuada es la siguiente:

Tenga en cuenta que estos valores son distintos de DisplayMemberPath(que se define en ItemsControl, no en 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 avatar Feb 04 '2011 19:02 Dan J

SelectedItemy SelectedValueson un object. y SelectedValuePathes un string.

por ejemplo usando el ListBox:

A continuación listbox1.SelectedValuese convierte en un valor de cadena.

string value = listbox1.SelectedValue;

si dices dame listbox1.SelectedItemte dará el objeto completo.

ListItem item = listbox1.SelectedItem;
string value = item.value;
capdragon avatar Feb 04 '2011 19:02 capdragon

Inspirado por esta pregunta, escribí un blog junto con el fragmento de código aquí . A continuación se muestran algunos de los extractos del blog.

SelectedItem: el elemento seleccionado ayuda a vincular el valor real del origen de datos 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 se ha seleccionado el elemento.

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

Vikram avatar Aug 03 '2015 06:08 Vikram

Cada control que utiliza Colecciones para almacenar datos tiene la propiedad SelectedValue, SelectedItem. 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 en eso antes. Pero lo anterior es una forma más efectiva de recibir mensajes de 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 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

soccer7 avatar Mar 13 '2014 19:03 soccer7