Un élément de liste de sélection WPF peut-il & # 8220; lire uniquement & # 8221 ;?

StackOverflow https://stackoverflow.com/questions/161127

  •  03-07-2019
  •  | 
  •  

Question

Nous avons un scénario dans lequel nous souhaitons afficher une liste d'éléments et indiquer lequel est le "courant". élément (avec un petit marqueur de flèche ou une couleur d’arrière-plan modifiée).

ItemsControl ne nous convient pas, car nous avons besoin du contexte de "SelectedItem". Cependant, nous souhaitons déplacer la sélection par programmation et ne pas permettre à l'utilisateur de la modifier.

Existe-t-il un moyen simple de rendre un ListBox non interactif? Nous pouvons le tromper en avalant délibérément les événements clavier et souris, mais il me manque une propriété fondamentale (telle que la définition de "IsEnabled" sur false sans affecter son style visuel) qui nous donne ce que nous voulons?

Ou ... existe-t-il un autre contrôle WPF qui soit le meilleur des deux mondes: un contrôle ItemsControl avec une propriété SelectedItem?

Était-ce utile?

La solution

Une option consiste à définir ListBoxItem.IsEnabled sur false :

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

Cela garantit que les éléments ne peuvent pas être sélectionnés, mais ils ne peuvent pas restituer votre rendu. Pour résoudre ce problème, vous pouvez jouer avec des déclencheurs et / ou des modèles. Par exemple:

<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>

Autres conseils

J'ai eu le même problème. Je l'ai résolu en laissant le paramètre IsEnabled à true et en gérant l'événement PreviewMouseDown du ListBox. Dans le gestionnaire, définissez e.Handled sur true si vous ne souhaitez pas le modifier.

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

Les données de votre ItemsControl / ListBox sont-elles liées?

Je pense simplement que vous pouvez créer le pinceau d'arrière-plan de chaque élément lié à une propriété à partir des données source ou transférer la propriété via un convertisseur. Quelque chose comme:

  <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>

Fonctionnalité ListBoxItem (ou ListViewItem) non sélectionnable à l'aide des propriétés attachées: http: // thrash505. wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top