Saltar al contenido

Diferencia entre SelectedItem, SelectedValue y SelectedValuePath

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>. los SelectedItem la propiedad le devolverá el seleccionado actualmente Category 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 su ID 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 un 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 que la propiedad ID del objeto Categoría se asigne al CategoryID propiedad en el objeto Producto. Aquí es donde el SelectedValuePath y el SelectedValue 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 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). 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 strings.

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;
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *