Frage

Wir haben ein Szenario, in dem wir eine Liste der Elemente angezeigt werden sollen und geben an, welche der „aktuelle“ Artikel ist (mit einem kleinen Pfeil Marker oder einer veränderten Hintergrundfarbe).

Itemscontrol ist nicht gut für uns, weil wir den Kontext von „SelectedItem“ benötigen. Wir wollen aber die Auswahl programattically und nicht zulassen, dass der Benutzer sich bewegen, sie zu ändern.

Gibt es eine einfache Art und Weise ein ListBox nicht-interaktiv zu machen? Wir können es frisieren von Maus- und Tastaturereignisse bewusst Schlucken, aber bin ich eine grundlegende Eigenschaft fehlt (wie „IsEnabled“ auf false setzen, ohne seine visuellen Stil zu beeinflussen), das gibt uns, was wir wollen?

oder ... gibt es eine anderes WPF-Steuerelement, das das Beste aus beiden Welten ist - ein Item mit einer SelectedItem-Eigenschaft

War es hilfreich?

Lösung

Eine Option ist ListBoxItem.IsEnabled einstellen false:

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

Damit wird sichergestellt, dass die Elemente nicht wählbar sind, aber sie können nicht machen, wie Sie möchten. Um dies zu beheben, können Sie mit Trigger und / oder Vorlagen rumspielen. Zum Beispiel:

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

Andere Tipps

Ich hatte das gleiche Problem. Ich beschloss, es durch den IsEnabled Satz auf true zu verlassen und das Preview Ereignisses der ListBox Handhabung. Im Set-Handler auf true im Fall e.Handled Sie nicht wollen, es zu bearbeiten.

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

Ist Ihr Items / ListBox Databound?

Ich denke nur Sie den Hintergrund Pinsel jedes Element auf eine Eigenschaft aus den Quelldaten gebunden machen könnte, oder die Eigenschaft durch einen Konverter übergeben. So etwas wie:

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

Nicht wählbar ListBoxItem (oder ListViewItem) -Funktionalität angebrachte Eigenschaften mit: http: // thrash505. wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top