Domanda

Abbiamo uno scenario in cui vogliamo visualizzare un elenco di elementi e indicare quale è la "corrente" elemento (con un piccolo indicatore di freccia o un colore di sfondo modificato).

ItemsControl non ci va bene, perché abbiamo bisogno del contesto di " SelectedItem " ;. Tuttavia, vogliamo spostare la selezione in modo programmatico e non consentire all'utente di modificarla.

Esiste un modo semplice per rendere un ListBox non interattivo? Possiamo confonderlo deliberatamente ingoiando gli eventi del mouse e della tastiera, ma mi sto perdendo alcune proprietà fondamentali (come l'impostazione di "Abilita" su false senza influire sul suo stile visivo) che ci danno ciò che vogliamo?

Oppure ... esiste un altro controllo WPF che è il migliore dei due mondi: un ItemsControl con una proprietà SelectedItem?

È stato utile?

Soluzione

Un'opzione è impostare ListBoxItem.IsEnabled su false :

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

Ciò garantisce che gli elementi non siano selezionabili, ma potrebbero non renderli come preferisci. Per risolvere questo problema, puoi giocare con trigger e / o modelli. Ad esempio:

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

Altri suggerimenti

Ho avuto lo stesso problema. L'ho risolto lasciando IsEnabled impostato su true e gestendo l'evento PreviewMouseDown di ListBox. Nel set di gestori e.Handled su true nel caso in cui non si desideri che venga modificato.

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

Il tuo database ItemsControl / ListBox è?

Sto solo pensando che potresti rendere il pennello di sfondo di ciascun elemento legato a una proprietà dai dati di origine o passare la proprietà attraverso un convertitore. Qualcosa del tipo:

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

Funzionalità ListBoxItem (o ListViewItem) non selezionabile utilizzando le proprietà associate: http: // thrash505. wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top