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

Foi útil?

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/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top