2009-05-06 8 views
14

In WPF Auswahl, würde Ich mag den ausgewählten Indizes einer System.Windows.Controls.ListBoxProgrammatically Artikel/Indizes in einem ListBox

ich beste Weise, die ich bisher gefunden habe setzen, ist alles zu entfernen, die Elemente aus dem Steuerelement, fügen Sie das ausgewählte, Call SelectAll(), dann fügen Sie den Rest ein, aber diese Lösung funktioniert weder in meiner Situation noch ist sehr effizient.

Also, wie Sie Elemente in einer Listbox festlegen, programmgesteuert ausgewählt werden?

Antwort

9

Eine Möglichkeit besteht darin, ein ausgewähltes Feld zu Ihrem Datenobjekt hinzuzufügen. Dann müssen Sie den standardmäßigen Stil listboxitem überschreiben und die Eigenschaft isselected an die Eigenschaft Selected in Ihrem Objekt binden. Dann müssen Sie nur Ihre Datenelemente durchgehen und den ausgewählten Wert aktualisieren.

Wenn Sie diese Selected-Eigenschaft nicht als Abhängigkeitseigenschaft implementieren, müssen Sie die INotifyPropertyChanged-Schnittstelle implementieren und das propertychange-Ereignis auslösen, wenn Sie den Wert festlegen.

+0

Das hat perfekt funktioniert, vielen Dank! – Alex

+0

Danke! ... Das hat gut funktioniert. Ich füge einfach ein Code-Segment hinzu, das ich unten verwendet habe. –

+0

eigentlich ist dies im Vergleich zu danlash's zu kompliziert. – henon

2

Sie haben, dies zu tun:

ListBoxObject.SelectedItem = ListBoxObject.Items.GetItemAt(itemIndex); 

Wo itemIndex das Element sein würde, die Sie auswählen möchten. Wenn Sie mehrere Elemente auswählen möchten, müssen Sie die ListBox.SelectedIndexCollection-Eigenschaft verwenden.

+1

System.Windows.Controls.ListBox ist nicht wie System.Windows.Forms.ListBox in einer SelectedIndexCollection-Eigenschaft – Alex

+0

My bad. Das tut mir leid. – jgallant

+0

SelectedItem funktioniert weiterhin. –

26

Sie können mehrere Elemente als ausgewählt festlegen, indem Sie die SelectedItems-Auflistung verwenden. Dies ist nicht durch den Index, sondern durch das, was Sie gebunden haben:

foreach (var boundObject in objectsBoundToListBox) 
{ 
    ListBox.SelectedItems.Add(boundObject); 
} 
+1

Dies wird das SelectionChanged-Ereignis für jedes hinzugefügte Element einmal auslösen. Wenn Sie eine Gruppe von Elementen manuell mit Verschiebung auswählen, wird sie nur einmal für die gesamte Gruppe erhöht. – FreddyFlares

2

wie programmatisch in mehrere Elemente in Listenfeld auswählen wpf

foreach (var boundObject in objectsBoundToListBox) 
{ 
    ListBox.SelectedItems.Add(boundObject); 
} 
+0

Danke, das rockt! – henon

+5

Hast du das tatsächlich von danlash auf diesen Thread geschnitten und eingefügt. – Epirocks

1

Dank mdm20. Mein Fall war tatsächlich eine innerhalb der ListBox zu überprüfen, und diese Dependency-Eigenschaft arbeitete wie ein Charme. musste ich meine eigene Klasse von DependencyObject erben und die Eigenschaft zu implementieren

public class ProjectListItem : DependencyObject{ 

    public Boolean IsChecked 
    { 
     get { return (Boolean)this.GetValue(CheckedProperty); } 
     set { this.SetValue(CheckedProperty, value); } 
    } 
    public static readonly DependencyProperty CheckedProperty = 
     DependencyProperty.Register("IsChecked", typeof(Boolean), typeof(ProjectListItem), 
            new PropertyMetadata(false)); 
} 
1

Sie dies für mehrere Abschnitte tun können:

ListBoxObject.SelectedItems.Add(ListBoxObject.Items.GetItemAt(i)); 

wo ich den Elementindex ist.