2011-02-04 15 views
274

¿Cuál es la diferencia betweeen lo siguiente:Diferencia entre SelectedItem, SelectedValue y SelectedValuePath

Todas estas propiedades de dependencia se define en Selector clase. 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 use con algunos ejemplos simples.

+3

Bea tiene una publicación de blog con explicación y código de muestra que puede descargar ... http: //bea.stollnitz.com/blog/? P = 9 –

+1

posible duplicación de [confundido con wpf ComboBox DisplayMemberPath, SelectedValue y SelectedValuePath] (http://stackoverflow.com/questions/3797034/confused-with-wpf-combobox-displaymemberpath-selectedvalue-and-selectedvaluepath) –

Respuesta

434

Sus nombres pueden ser un poco confusos :). He aquí un resumen:

  • El SelectedItem propiedad devuelve todo el objeto de que su lista está enlazado. Por lo tanto, supongamos que ha vinculado una lista a una colección de objetos Category (con cada objeto Categoría con nombre y propiedades de ID). p.ej. ObservableCollection<Category>. La propiedad SelectedItem le devolverá el objeto actualmente seleccionado Category. No obstante, 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 ID propiedad).

  • Por lo tanto, tienen la propiedadSelectedValuePath y la propiedadSelectedValue como un medio alternativo de unión (los utiliza en conjunción con los otros). Supongamos que tiene un objeto Product al que está sujeta su vista (con propiedades para elementos como ProductName, Weight, etc.). Supongamos también que tiene una propiedad CategoryID en ese objeto Product 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 CategoryID en el objeto Producto. Aquí es donde entran las propiedades SelectedValuePath y SelectedValue. Usted especifica que la propiedad ID en el objeto Categoría debe asignarse a la propiedad en el objeto Producto al que está vinculada la lista usando , y luego enlaza la propiedad SelectedValue con la propiedad en el DataContext (es decir, el Producto).

El ejemplo siguiente 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).

<ComboBox ItemsSource="{Binding Categories}" 
      SelectedValue="{Binding CategoryID, Mode=TwoWay}" 
      SelectedValuePath="ID" 
      DisplayMemberPath="Name" /> 

Es un poco confuso al principio, pero espero que esto hace que sea un poco más claro ... :)

Chris

+5

Gracias por la explicación. ¿Eres el mismo tipo que ha escrito un libro sobre Silverlight? No creo que te estoy hablando. : -) ... Estoy leyendo este libro hoy en día. Realmente un trabajo increíble. :-) – Nawaz

+12

Sí, soy yo :). Guardo estas partes aquí para responder preguntas cuando puedo. Me alegra que estés disfrutando el libro :). Como tiene el libro, encontrará más información sobre este tema en las páginas 69-70 y en la página 204. –

+7

+1. +100. Usted, señor, es un dios de oro entre los hombres inferiores. Que Dios te bendiga y todos los que navegan en ti. :) En serio, solo pasé dos horas tratando de resolverlo, ¡gracias! – TarkaDaal

8

es object. SelectedValue y SelectedValuePath son string s.

por ejemplo usando el cuadro de lista:

si dice que me dan listbox1.SelectedValue devolverá el texto del elemento seleccionado en ese momento.

string value = listbox1.SelectedValue; 

si dice dame listbox1.SelectedItem que le dará todo el objeto.

ListItem item = listbox1.SelectedItem; 
string value = item.value; 
+1

** 'SelectedValue' ** también es un' object' y no 'string '. Pls vea [aquí] (https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvalue (v = vs.110) .aspx) –

53

Para responder un poco más conceptual:

SelectedValuePath define qué propiedad (por su nombre) de los objetos con destino al cuadro de lista de ItemsSource será utilizado como el elemento de SelectedValue.

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

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

SelectedItem, mientras tanto, devuelve el objeto Person seleccionado actualmente.

(Aquí está a further example from MSDN, utilizando TreeView)

Actualización: @ Joe Como señaló, la propiedad DisplayMemberPath no está relacionado con las propiedades seleccionadas *.Su descripción adecuada de la siguiente manera:

Tenga en cuenta que estos valores son distintos de DisplayMemberPath (que se define en ItemsControl, no Selector), pero que la propiedad tiene un comportamiento similar al SelectedValuePath: en ausencia de un estilo/plantilla, que identifica qué la propiedad del objeto vinculado al elemento se debe usar como su representación de cadena.

+4

Esto es incorrecto. 'DisplayMemberPath' define la propiedad que se usará para mostrar el elemento seleccionado (así como otros elementos). 'SelectedValuePath' es la ruta de acceso a la propiedad del' SelectedItem' que devuelve la propiedad 'SelectedValue', como indica correctamente en el quinto párrafo, pero no tiene nada que ver con lo que se muestra. – Joe

+0

@Joe Buena captura. He corregido mi respuesta. –

0

Cada control que utiliza colecciones para almacenar datos tienen la propiedad SelectedValue, 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 a continuación, se puede escribir:

ListBox1.SelectedItem.Text; 

Su ListBox1 también puede devolver texto mediante la propiedad SelectedValue si el valor se establece en eso antes. 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 el valor que podemos utilizar

ListBox1.SelectedValue 
4

inspirado por esta pregunta, he escrito un blog junto con el code snippet here. A continuación se muestran 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.