2012-04-05 14 views
1

aufgrund des mvvm-Musters Das Modell sollte nichts über ViewModel wissen.WPF MVVM-Muster ObservableCollection

Was passiert, wenn ich ein ListBox Feld in einem meiner Modell erstellen. Sieht gut und richtig aus. Aber nächsten Schritt muss ich diesen Wert an die ObservableCollection in ModelView binden.

Ich kann dies tun:

var myCollection = new ObservableCollection (myList);

Aber in diesem Fall habe ich von allen Vorteilen für OC verloren. Diese Sammlung wurde statisch gemacht und keine Einfügungen oder Aktualisierungen spiegeln sich in meiner Ansicht wider, die an diese Sammlung gebunden ist.

Irgendwelche Gedanken?

Antwort

1

Wenn Sie

var myCollection = new ObservableCollection (ListBox) 

rufen Sie die Werte von myList in die ObservableCollection kopieren. Nichts hier wird ListBox-Liste aktualisieren.

Wenn dies der gewünschte Effekt ist, und Sie können Ihre Ansichtsmodell mit aktualisieren möchten:

///... 
var myCollection = new ObservableCollection (ListBox) 
myCollection.CollectionChanged += (sender, args) => RefreshListBox(myCollection); 
///... 
private void RefrehListBox(ObservableCollection<...> collection){ 
//Refresh ListBox with collection 
} 

diese Weise jedes Mal die ObservableCollection-Updates, synchronisieren Sie das zugrunde liegende Modell mit den Änderungen.

+0

Eine gute Möglichkeit, ModelView mit Model zu synchronisieren. Aber wie wäre es umgekehrt - Aktualisieren von ViewModel von Model? – alerya

+2

Nun, Sie werden wahrscheinlich einen anderen Event-Mechanismus brauchen, wenn Sie wollen, dass es so nahtlos funktioniert. Sie können eine andere ObservableCollection im Modell verwenden oder eigene Ereignisse schreiben, auf die die VM zugreifen kann. –

2

Normalerweise verwenden Sie eine ObservableCollection, da die Schnittstellen automatisch aktualisiert werden. Ich denke du machst etwas falsch. In Ihrem ViewModel haben Sie die ObservableCollection mit einer Liste von Elementen, die Sie mit einer normalen Liste eines Arrays von Elementen initialisieren können. Sie sollten Ihr OC nicht mit Ihrer ListBox initialisieren. Nachdem Sie es in Ihrer Ansicht binden müssen. Wenn Sie ein Element in Ihrem OC hinzufügen, wird die Ansicht aktualisiert.

+0

Aber ich aktualisiere myList in Model - keine OC in View Model. Sieht so aus, als müsste ich mein eigenes Event machen, um OC zu aktualisieren? – alerya

+1

Wenn Ihr Modell keine Möglichkeiten hat, Änderungen zu signalisieren, dann ja - Sie müssen etwas erfinden, das wird. Ie. Verfügen über eine VM-Methode zum Hinzufügen von Elementen, die die zugrunde liegende M-Methode aufruft, und aktualisiert auch die ObservableCollection in der VM. Ihre ComboBox wäre an OC auf der VM gebunden. – Goran

Verwandte Themen