Diferencia entre SelectedItem, SelectedValue y SelectedValuePath
¿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 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
. Explique su uso con algunos ejemplos sencillos.
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
Category
objetos (cada objeto de Categoría tiene propiedades de Nombre e ID). p.ej.ObservableCollection<Category>
. LaSelectedItem
propiedad le devolverá elCategory
objeto 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 suID
propiedad ).Por lo tanto, tenemos la propiedad SelectedValuePath y la propiedad SelectedValue como medio alternativo de vinculación (se usan conjuntamente). Digamos que tiene un
Product
objeto al que está vinculada su vista (con propiedades para cosas como Nombre del Producto, Peso, etc.). Digamos también que tiene unaCategoryID
propiedad 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 laCategoryID
propiedad del objeto Producto. Aquí es donde entran en juegoSelectedValuePath
las propiedades ySelectedValue
. 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 usarSelectedValuePath='ID'
y luego vincula laSelectedValue
propiedad 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
Para responder un poco más conceptualmente:
SelectedValuePath
define qué propiedad (por su nombre) de los objetos vinculados al ListBox ItemsSource
se utilizará como propiedad del elemento SelectedValue
.
Por ejemplo, si su ListBox está vinculado a una colección de Person
objetos, cada uno de los cuales tiene propiedades Name
, Age
y Gender
, SelectedValuePath=Name
hará que el valor de la propiedad seleccionada Person
se Name
devuelva en SelectedValue
.
Tenga en cuenta que si anula el ControlTemplate del ListBox (o aplica un estilo) que especifica qué propiedad debe mostrarse, SelectedValuePath
no se puede utilizar.
SelectedItem
, mientras tanto, devuelve el Person
objeto 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.
SelectedItem
y SelectedValue
son un object
. y SelectedValuePath
es un string
.
por ejemplo usando el ListBox:
A continuación listbox1.SelectedValue
se convierte en un valor de cadena.
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, 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.
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