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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top