2013-06-14 11 views
5

Ich habe eine Listbox, die Filter wie dies zu sein:Halte SelectedItem während der Filter von Collection

var view = CollectionViewSource.GetDefaultView(FilterSource); 
view.Filter = FilterCode; 

ich in ein Problem laufen lasse, wo die SelectedItem ist verloren, wenn die Filter mit Viewmodel Code wie folgt verwendet:

VM 
{ 
    public ObservableCollection<Model> Items{get;set;} 
    public Model SelectedItem 
    { 
     get{return _selectedItem;} 
     set{_selectedItem = value; NotifyPropertyChanged();} 
    } 
} 

Wenn der Filter angewendet wird, wird die SelectedItem zu null gesetzt. Ich möchte diesen ausgewählten Eintrag jedoch beibehalten, es sei denn, der Benutzer klickt tatsächlich darauf. Wenn der Filter entfernt wird, sollte das ausgewählte Objekt immer noch ausgewählt werden. Das Modell hat eine IsSelected Eigenschaft, und ich habe versucht, über Möglichkeiten zur Abfrage der IsSelected Eigenschaft nachzudenken. Doch dann verbindlich die Ansicht des würde die Art, wie ich erwarte nicht arbeiten .... oder zumindest ich in Kreisen würde denken, es kann nicht

+0

Wenn Ihre Sammlung einen Primärschlüssel hat, können Sie diese ID vor dem Filtern speichern und versuchen, den ausgewählten Eintrag nach dem Filtern mit dieser ID zu versehen – blindmeis

Antwort

0

Meine einzige Möglichkeit, ein Update hier zum Erreichen des folgenden im SelectionChanged Ereignisse ist:

if (e.AddedItems.Count == 0 && e.RemovedItems.Count >= 0) 
    SpecialtyListBox.SelectedItem = e.RemovedItems[0]; 

Aber das scheint wirklich hacky und erzwingt, dass es immer ein Element ausgewählt werden muss, sobald eine erste ausgewählt ist. In diesem Fall könnte das funktionieren, aber ich würde trotzdem gerne sehen, ob jemand eine bessere Lösung hat?

0

Ich hatte ein ähnliches Problem, wo die Listboxen als Registerkarten angezeigt wurden. Ich habe das Problem gelöst, indem ich einen Konverter erstellt habe, um ein boolesches Flag für "isActive" zu erzeugen und es CollectionViewSource.IsLiveFilteringRequested zuzuweisen. Dies verhinderte, dass die nicht aktiven Listenfelder das ausgewählte Element aktualisierten.

0

Sie können dies beheben, indem Sie einen Filter erstellen, der das aktuell ausgewählte Element immer zu den gefilterten Elementen hinzufügt. Wenn dies nicht direkt möglich ist, halten Sie das ausgewählte Element einfach in einer separaten Variablen.