2012-04-06 5 views
0

Ich habe eine Reihe von Combos, die alle die gleiche Auswahl haben. Diese Auswahlmöglichkeiten werden in einer Sammlung bereitgestellt, die in meinem ViewModel verfügbar gemacht wird. Alles in Ordnung und Dandy.Verwirrt über CollectionViewSource (SelectedItem funktioniert nicht in Combos)

Ich möchte jetzt diese Auswahl sortiert, so entschied ich mich, eine ICollectionView von meinem ViewModel statt meiner üblichen ReadonlyObservableCollection<T> auszusetzen, und sortieren Sie die Sammlungsansicht in meinem ViewModel. Diese

class EditStuffViewModel : ViewModelBase 
{ 
    public EditStuffViewModel (ObservableCollection<Choice> choices) 
    { 
     Choices = new CollectionViewSource() { Source = choices }.View; 
     Choices.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); 
    } 

    public ICollectionView Choices 
    { 
     get; 
     private set; 
    } 

    //snip other properties 
} 

alles funktioniert gut, außer dass jetzt alle meine Combos synchronisieren nun ihre Auswahl.

Das ist nicht was ich will. Ich möchte, dass die Auswahlmöglichkeiten geteilt werden, die Auswahl aber auf ihre normalen Bindungen beschränkt ist. Ich denke, ich verstehe, dass mein CollectionView die Auswahl nachverfolgt, aber ich dachte, dass dies das Verhalten war, das für jedes Steuerelement aktiviert wurde.

ich versucht habe ausdrücklich IsSynchronizedWithCurrentItem="False" auf meine Combos Einstellung, die sie erfolgreich abkoppelt, aber dann meine gebundenen SelectedItem wird nie in der Combo ausgewählt (die Ansichtsmodell des gebundenen Getter genannt, aber das Ergebnis nie ausgewählt wird). Das Auswählen eines Elements scheint den Setter meines ViewModels korrekt zu aktualisieren.

Ich vermisse offensichtlich etwas grundlegend, wie CollectionView funktionieren soll. Kann mich jemand aufklären?

EDIT: Mein schlecht, die DOES Arbeit mit IsSynchronizedWithCurrentItem="False". Siehe meine Antwort für Details.

Prost.

+0

In der Lösung mit IsSynchronizedWithCurrentItem = "False" haben Sie INotifyPropertyChanged verwendet? OnPropertyChanged ("SelectedItem") – Dummy01

Antwort

2

Es tut mir sehr leid für die Verschwendung aller Zeit, aber Einstellung IsSynchronizedWithCurrentItem="False" funktioniert. Ich hatte auch einen Filter mit der Sortierung hinzugefügt, und die standardmäßig ausgewählten Werte waren nicht in der gefilterten Liste der Elemente. Hoppla.

Was, warum ich brauchte, um explizit IsSynchronizedWithCurrentItem auszuschalten, wenn ich normalerweise nie auf Standard-Sammlungen tun, wird Licht auf MSDN

wahr wenn die SelectedItem immer mit dem aktuellen Elemente in den ItemCollection synchronisiert ist ; false wenn das SelectedItem niemals mit dem aktuellen Element synchronisiert wird; Nichts, wenn das SelectedItem nur dann mit dem aktuellen Element synchronisiert wird, wenn der Selector eine CollectionView verwendet. Der Standardwert ist Nichts.

Also mit anderen Worten, wenn Sie eine CollectionView explizit eher nutzen als die Standardansicht auf einer normalen Sammlung verwenden, erhalten Sie Auswahl sync.

0

Ich habe WPF seit einiger Zeit nicht mehr berührt, aber ich denke, dass Sie für jede Combobox für den ausgewählten zu pflegenden Artikel unterschiedliche Instanzen von CollectionViewSource benötigen.

Ich denke, das liegt daran, dass die SelectedItem Eigenschaft des Element Zustand Eigenschaft ausgewählt ist CollectionViewSource Objekt gebunden wird (Ich vermute, dass das View Objekt hat es) und die Combobox alle die gleiche Quellinstanz, damit ihr ausgewähltes Element sind jetzt synchronisiert

Verwenden Sie einfach verschiedene Instanzen von CollectionViewSource für jede Ihrer ComboBoxen. Sie können immer noch dieselben Quellen auswählen. Sie benötigen nur verschiedene VMs, da sich Ihre ComboBoxes getrennt voneinander verhalten sollten.


So etwas wie diese (nicht getestet):

class EditStuffViewModel : ViewModelBase 
{ 
    public EditStuffViewModel (ObservableCollection<Choice> choices) 
    { 
     ChoiceViews = new List<ICollectionView>(); 

     for (var i = 0; i < 10; i++) { 
      var viewSource = new CollectionViewSource() { Source = choices }; 
      viewSource.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); 

      ChoiceViews.Add(viewSource.View); 
     } 
    } 

    public IList<ICollectionView> ChoiceViews 
    { 
     get; private set; 
    } 

    //snip other properties 
} 

Dann wird Ihr Comboboxen ändern, um ein Element von ChoiceViews statt zu binden binden.

+0

Vielen Dank für Ihren Beispielcode, aber es ist einfach nicht möglich, eine neue Instanz für jede Combo zu sortieren. Die Anzahl der Combos ist dynamisch und es gibt eine Menge em. Ich denke, ich muss die Sammlung nur einmal sortieren und enthüllen. – GazTheDestroyer