Pode um WPF ListBox ser “somente leitura”?
-
03-07-2019 - |
Pergunta
Nós temos um cenário onde queremos exibir uma lista de itens e indicar qual é o item "corrente" (com um pouco de marcador de seta ou uma cor de fundo alterado).
ItemsControl não é bom para nós, porque precisamos do contexto de "SelectedItem". No entanto, queremos mover a seleção programattically e não permitir que o usuário alterá-lo.
Existe uma maneira simples de fazer uma caixa de listagem não interativa? Nós podemos falsificar isso engolindo deliberadamente eventos do mouse e do teclado, mas estou faltando alguma propriedade fundamental (como o ajuste "IsEnabled" como false sem afetar seu estilo visual) que nos dá o que queremos?
Ou ... há outro controle WPF que é o melhor dos dois mundos -? Um ItemsControl com uma propriedade SelectedItem
Solução
Uma opção é conjunto ListBoxItem.IsEnabled
para false
:
<ListBox x:Name="_listBox">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsEnabled" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Isso garante que os itens não são selecionáveis, mas eles não podem tornar como você gosta. Para corrigir isso, você pode brincar com gatilhos e / ou modelos. Por exemplo:
<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>
Outras dicas
Eu tive o mesmo problema. Resolvi que, deixando o conjunto IsEnabled como true e manipular o evento PreviewMouseDown do ListBox. No conjunto manipulador e.Handled a verdade no caso de você não quer que ele seja editado.
private void lstSMTs_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
e.Handled = !editRights;
}
é seu databound ItemsControl / ListBox?
Eu só estou pensando que você poderia fazer a escova fundo de cada item ligado a uma propriedade dos dados de origem, ou passar a propriedade através de um conversor. 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>
ListBoxItem não seleccionáveis ??(ou ListViewItem) funcionalidade usando anexado propriedades: http: // thrash505. wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/