¿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>
Funcionalidad ListBoxItem no seleccionable (o ListViewItem) utilizando propiedades adjuntas: http://thrash505.wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/
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>