wpf listbox itemscontrol

¿Puede un WPF ListBox ser "de solo lectura"?



listbox itemtemplate wpf (4)

Tenemos un escenario en el que queremos mostrar una lista de elementos e indicar cuál es el elemento "actual" (con un pequeño marcador de flecha o un color de fondo modificado).

ItemsControl no es bueno para nosotros, porque necesitamos el contexto de "SelectedItem". Sin embargo, queremos mover la selección programáticamente y no permitir que el usuario la cambie.

¿Hay alguna manera simple de hacer que ListBox no sea interactivo? Podemos ignorarlo deliberadamente tragando los eventos del mouse y el teclado, pero ¿me falta alguna propiedad fundamental (como configurar "IsEnabled" en falso sin afectar su estilo visual) que nos da lo que queremos?

O ... ¿hay otro control WPF que sea el mejor de ambos mundos, un ItemsControl con una propiedad SelectedItem?


¿Está su ItemsControl / ListBox enlazado a datos?

Solo estoy pensando que podría hacer que el Pincel de fondo de cada elemento se vincule a una propiedad desde los datos de origen, o pasar la propiedad a través de un convertidor. Algo como:

<ItemsControl DataContext="{Binding Source={StaticResource Things}}" ItemsSource="{Binding}" Margin="0"> <ItemsControl.Resources> <local:SelectedConverter x:Key="conv"/> </ItemsControl.Resources> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <local:Control Background="{Binding Path=IsSelected, Converter={StaticResource conv}}"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel>



Tuve el mismo problema. Lo resolví dejando el conjunto de IsEnabled en true y manejando el evento PreviewMouseDown del ListBox. En el conjunto de controles e.Hechados a verdadero en el caso de que no desee que se edite.

private void lstSMTs_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { e.Handled = !editRights; }


Una opción es establecer ListBoxItem.IsEnabled en false :

<ListBox x:Name="_listBox"> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="IsEnabled" Value="False"/> </Style> </ListBox.ItemContainerStyle> </ListBox>

Esto garantiza que los elementos no se puedan seleccionar, pero es posible que no se reproduzcan a su gusto. Para solucionar esto, puede jugar con desencadenantes y / o plantillas. Por ejemplo:

<ListBox x:Name="_listBox"> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="IsEnabled" Value="False"/> <Style.Triggers> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Foreground" Value="Red" /> </Trigger> </Style.Triggers> </Style> </ListBox.ItemContainerStyle> </ListBox>