wpf silverlight xaml selecteditem selectedvalue

wpf - Diferencia entre SelectedItem, SelectedValue y SelectedValuePath



silverlight xaml (5)

Para responder un poco más conceptualmente:

SelectedValuePath define qué propiedad (por su nombre) de los objetos vinculados al ItemsSource de ListBox se utilizará como el SelectedValue del elemento.

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

Tenga en cuenta que si reemplaza el ControlTemplate de ListBox (o aplica un estilo) que especifica qué propiedad debe mostrar, SelectedValuePath no se puede usar.

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

(Aquí hay un ejemplo más de MSDN , usando TreeView)

Actualización: como @Joe señaló, la propiedad DisplayMemberPath no está relacionada con las propiedades Seleccionadas *. Su descripción apropiada sigue:

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 de SelectedValuePath : en ausencia de un estilo / plantilla, identifica qué propiedad del objeto vinculado al elemento debe usarse como su representación en cadena.

Cuál es la diferencia entre lo siguiente:

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 . Por favor explique su uso con algunos ejemplos simples.


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

  • La propiedad SelectedItem devuelve el objeto completo al que está vinculada su lista. Entonces, digamos que ha enlazado una lista a una colección de objetos de Category (con cada objeto de Categoría que tiene propiedades de Nombre e ID). p.ej. ObservableCollection<Category> . La propiedad SelectedItem le devolverá el objeto Category actualmente seleccionado. Sin embargo, para fines de enlace, esto no siempre es lo que desea, ya que solo le permite enlazar un objeto de Categoría completo a la propiedad a la que está vinculada la lista, no el valor de una propiedad única en ese objeto de Categoría (como su ID propiedad).

  • Por lo tanto, tenemos la propiedad SelectedValuePath y la propiedad SelectedValue como un medio alternativo de enlace (los usa junto con el otro). Supongamos que tiene un objeto Product , al que está vinculada su vista (con propiedades para cosas como ProductName, Weight, etc.). Supongamos también que tiene una propiedad CategoryID en ese objeto de 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 propiedad CategoryID en el objeto Producto. Aquí es donde entran las propiedades SelectedValuePath y SelectedValue . Especifica que la propiedad ID en el objeto Categoría debe asignarse a la propiedad en el objeto Producto a la que la lista está vinculada mediante SelectedValuePath=''ID'' , y luego vincular 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). 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 muestra la propiedad Nombre 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 lo haga un poco más claro ... :)

Chris


Todos los controles que utilizan Colecciones para almacenar datos tienen SelectedValue, SelectedItem. Ejemplos de estos controles son ListBox, Dropdown, RadioButtonList, CheckBoxList.

Para ser más específico, si literalmente desea recuperar 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 anteriormente. Pero lo anterior 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 Text of ListBox1, sin embargo, también podemos insertarlo, pero usamos para insertar el valor del elemento seleccionado. Para obtener valor podemos usar

ListBox1.SelectedValue


inspirado por esta pregunta, he escrito un blog junto con el fragmento de código aquí . A continuación algunos de los extractos del blog.

SelectedItem: Selected Item ayuda a vincular el valor real del DataSource que se mostrará. Esto 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 de combobox. Pero estas propiedades vienen a rescatar cuando queremos vincular nuestro cuadro combinado con el valor de un objeto ya creado. Consulte mi último escenario en la siguiente lista para obtener una breve idea de las propiedades.


SelectedItem es un object . SelectedValue y SelectedValuePath son string s.

por ejemplo usando el cuadro de lista:

si dice que me da listbox1.SelectedValue , devolverá el texto del elemento seleccionado actualmente.

string value = listbox1.SelectedValue;

si dices, dame listbox1.SelectedItem , te dará todo el objeto.

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