Solución:
Sus nombres pueden ser un poco confusos :). He aquí un resumen:
-
los Item seleccionado La propiedad devuelve el objeto completo al que está vinculada su lista. Supongamos que ha enlazado una lista a una colección de
Category
objetos (cada objeto de categoría tiene propiedades de nombre e ID). p.ej.ObservableCollection<Category>
. losSelectedItem
la propiedad le devolverá el seleccionado actualmenteCategory
objeto. Sin embargo, para fines de vinculación, esto no siempre es lo que desea, ya que esto solo le permite vincular un objeto de categoría completo a la propiedad a la que está vinculada la lista, no el valor de una sola propiedad en ese objeto de categoría (como suID
propiedad). -
Por lo tanto tenemos el SelectedValuePath propiedad y la SelectedValue propiedad como un medio alternativo de vinculación (los usa junto con los demás). Digamos que tienes un
Product
objeto, al que está vinculada su vista (con propiedades para cosas como ProductName, Weight, etc.). Digamos también que tienes unCategoryID
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 alCategoryID
propiedad en el objeto Producto. Aquí es donde elSelectedValuePath
y elSelectedValue
las propiedades entran. 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 enlazar elSelectedValue
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). Vinculamos 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 muestre la propiedad Name 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; }
}
Es un poco confuso al principio, pero con suerte esto lo aclara un poco … 🙂
Chris
Para responder un poco más conceptualmente:
SelectedValuePath
define qué propiedad (por su nombre) de los objetos vinculados al ListBox ItemsSource
se utilizará como el artículo SelectedValue
.
Por ejemplo, si su ListBox está vinculado a una colección de Person
objetos, cada uno de los cuales tiene Name
, Age
, y Gender
propiedades, SelectedValuePath=Name
causará el valor del seleccionado Person
‘s Name
propiedad que se devolverá en SelectedValue
.
Tenga en cuenta que si anula la ControlTemplate de ListBox (o aplica un estilo) que especifica qué propiedad debe mostrarse, SelectedValuePath
No puede ser usado.
SelectedItem
, mientras tanto, devuelve todo Person
objeto seleccionado actualmente.
(Aquí hay un ejemplo adicional de MSDN, usando TreeView)
Actualizar: Como señaló @Joe, la propiedad DisplayMemberPath no está relacionada con las propiedades Selected *. 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
es un object
.
SelectedValue
y SelectedValuePath
están string
s.
por ejemplo, usando ListBox:
si dices dame listbox1.SelectedValue
devolverá el texto del elemento seleccionado actualmente.
string value = listbox1.SelectedValue;
si dices dame listbox1.SelectedItem
le dará el objeto completo.
ListItem item = listbox1.SelectedItem;
string value = item.value;