Selección programática de elementos / índices en un ListBox
Pregunta
En WPF, me gustaría establecer los índices seleccionados de un System.Windows.Controls.ListBox
La mejor manera que he encontrado hasta ahora es eliminar todos los elementos del control, insertar el seleccionado, llamar a SelectAll (), luego insertar el resto, pero esta solución no funciona en mi situación ni es muy eficiente.
Entonces, ¿cómo se configuran los elementos en un cuadro de lista para que se seleccionen mediante programación?
Solución
Una forma de hacerlo es agregar un campo Seleccionado a su objeto de datos. Luego, debe anular el estilo predeterminado de listboxitem y vincular la propiedad isselected a la propiedad Selected en su objeto. Luego solo necesita revisar sus elementos de datos y actualizar el valor Seleccionado.
Si no implementa esa propiedad Seleccionada como una propiedad de dependencia, necesita que su clase implemente la interfaz INotifyPropertyChanged y genere el evento de cambio de propiedad cuando establezca el valor.
Otros consejos
Puede configurar varios elementos como seleccionados utilizando la colección SelectedItems. Esto no es por índice, sino por lo que ha vinculado:
foreach (var boundObject in objectsBoundToListBox)
{
ListBox.SelectedItems.Add(boundObject);
}
cómo seleccionar mediante programación varios elementos en el cuadro de lista en wpf
foreach (var boundObject in objectsBoundToListBox)
{
ListBox.SelectedItems.Add(boundObject);
}
Tienes que hacer esto:
ListBoxObject.SelectedItem = ListBoxObject.Items.GetItemAt(itemIndex);
Donde itemIndex sería el elemento que desea seleccionar. Si desea seleccionar varios elementos, debe usar la propiedad ListBox.SelectedIndexCollection.
Gracias a mdm20.
Mi caso en realidad estaba verificando un CheckBox
dentro del ListBox
, y esta Propiedad de dependencia funcionó de maravilla.
Tuve que heredar mi clase personalizada de DependencyObject
e implementar la propiedad
public class ProjectListItem : DependencyObject{
public Boolean IsChecked
{
get { return (Boolean)this.GetValue(CheckedProperty); }
set { this.SetValue(CheckedProperty, value); }
}
public static readonly DependencyProperty CheckedProperty =
DependencyProperty.Register("IsChecked", typeof(Boolean), typeof(ProjectListItem),
new PropertyMetadata(false));
}
Puede hacer esto para varias secciones:
ListBoxObject.SelectedItems.Add(ListBoxObject.Items.GetItemAt(i));
Donde i es el índice del elemento.