2010-06-09 18 views
10

Ich habe eine einfache Ansichtsmodell wie:XAML auf eine Eigenschaft Collection Bindung an einem Ansichtsmodell

public class MainViewModel { 
    ObservableCollection<Project> _projects; 
    public MainViewModel() { 
     // Fill _projects from DB here... 
     ProjectList.Source = _projects; 
     ProjectList.Filter = ...; 
    } 

    public CollectionViewSource ProjectList { get; set; } 
} 

ich das Fenster des Datacontext auf eine neue Instanz dieser Ansichtsmodell im Konstruktor gesetzt:

public MainWindow() { 
    this.DataContext = new MainViewModel(); 
} 

Dann Im Xaml versuche ich, die ItemsSource einer ListBox an diese ProjectList-Eigenschaft zu binden.

Bindung nur Itemssource wie funktioniert so nicht funktionieren:

<ListBox ItemsSource="{Binding ProjectList}" ItemTemplate="..." /> 

Aber wenn ich zuerst die Datacontext rebase dies funktioniert:

<ListBox DataContext="{Binding ProjectList}" ItemsSource="{Binding}" ItemTemplate="..." /> 

Sollte nicht das erste richtig Methode? Was könnte ich falsch machen?

+0

Erhalten Sie Ihre Daten synchron oder asynchron aus der Datenbank? – Timores

+0

synchron, neben wenn es eine Race Condition war, dann würde auch die zweite Methode nicht funktionieren ... – joshperry

Antwort

16

Wenn Sie CollectionViewSource verwenden, müssen Sie ItemsSource an ProjectList.View statt ProjectList binden. Das sollte dein Problem lösen.

+0

Also ich denke ich kann mein Problem auch nicht so duplizieren ... Ich habe die Frage mit dem was das ViewModel "wirklich aktualisiert " sieht aus wie. – joshperry

+0

Siehe meine aktualisierte Antwort. Ich bin mir nicht ganz sicher, warum CollectionViewSource so funktioniert, aber so, wie ich immer mit ihnen arbeiten musste. –

+3

Danke, das ist sehr hilfreich. Dies ist das erste Mal, dass ich eine CollectionViewSource verwendet habe. Am Ende habe ich den Eigenschaftstyp ICollectionView erstellt und im Getter die Eigenschaft View aus einer privaten CollectionViewSource zurückgegeben. Auf diese Weise muss ich mich nicht um die Bindung an ".View" kümmern, die bei der späteren Änderung des Auflistungstyps dieser ViewModel-Eigenschaft beschädigt würde. – joshperry

0

Von dem, was Sie zur Verfügung gestellt die erste Methode sollte perfekt funktionieren. Der Teufel lauert irgendwo im Detail.

PS: Vielleicht haben Sie keine Implementierung von INotifyPropertyChanged Schnittstelle im Interesse der Postgröße angegeben, aber seien Sie vorsichtig in der Produktion. Es ist sehr einfach, eine memory leak zu bekommen, wenn Sie es nicht implementieren.

+0

Ja, es implementiert tatsächlich diese Schnittstelle. Nennen Sie es einen Testfall, wenn Sie so wollen. – joshperry

Verwandte Themen