MVVM Light Toolkit - RelayCommands, DelegateCommands, und ObservableObjects
Ich habe gerade angefangen, Experimentieren mit Laurent Bugnion ist MVVM Light Toolkit. Ich denke, ich werde wirklich wie es, aber ich habe ein paar Fragen stellen.
Bevor ich zu Ihnen, lassen Sie mich erklären, wo ich denn herkomme. Derzeit benutze ich eine Kombination von Josh Smith MVVM-Foundation und ein weiteres Projekt auf Codeplex genannt MVVM Toolkit. Ich benutze ObservableObject
und Messenger
von MVVM Foundation und DelegateCommand
und CommandReference
von MVVM Toolkit.
Die einzige wirkliche überschneidung zwischen MVVM-Foundation und MVVM Toolkit ist, dass Sie beide haben eine Implementierung für ICommand
: MVVM-Foundation hat RelayCommand
und MVVM Toolkit hat DelegateCommand
. Von diesen beiden ist die DelegateCommand
erscheint zu sein mehr anspruchsvolle. Es beschäftigt CommandManagerHelper
verwendet schwache Referenzen um Speicherverluste zu vermeiden.
Mit dieser sagte, hier sind meine Fragen:
-
Warum MVVM Light verwenden
RelayCommand
eher alsDelegateCommand
? Ist die Verwendung von schwachen Referenzen in einemICommand
unnötige oder nicht empfohlen, für einige Grund? -
Warum gibt es keine
ObservableObject
im MVVM-Light?ObservableObject
ist im Grunde nur der Teil derViewModelBase
implementiertINotifyPropertyChanged
, aber es ist sehr bequem, um als eine separate Klasse, weil die view-Modelle sind nicht die einzigen Objekte, die umgesetzt werden müssenINotifyPropertyChanged
. Zum Beispiel, sagen wir, Sie haben ein DataGrid bindet, um eine Liste derPerson
Objekte. Wenn eine der Eigenschaften inPerson
kann sich ändern, während der Benutzer anzeigen, die einem DataGridPerson
implementieren mussINotifyPropertyChanged
. (Mir ist klar, dass, wennPerson
automatisch generiert wird, mit so etwas wie LinqToSql, wird es wahrscheinlich bereits implementiertINotifyPropertyChanged
, aber es gibt Fälle, wo ich brauche, um Ansicht-spezifische Versionen von entity-model-Objekte, sagen, weil ich brauche, um einen Befehl zu unterstützen, eine button-Spalte in einem DataGrid.)
Dank.
P. S. Hier ist der code für DelegateCommand
aus dem MVVM Toolkit:
https://docs.google.com/document/pub?id=1ApCx5SbCfHi5fBhv8Ki3zA6j34sp2t80LQZdj89v8cU
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie es aussieht ist die Frage im Zusammenhang mit der ersten Frage wurde behoben in der neuesten build:
Laut Das MVVM Light Toolkit von Codeplex-Website (unter "Erhöhung der CanExecuteChanged-Ereignis manuell"), die
CommandManager
wurde ganz beseitigt.Als für
Observable Object
, ich habe ein Element, um die Issue-Tracker auf der Codeplex-Website.ObservableObject
wurde implementiert, wie auch jetzt.Können Sie auch prüfen,Catel. Es unterstützt ein DataObject (sowohl generische als auch nicht generische), die unterstützen genau das, was du suchst (ein Objekt die Implementierung von INotifyPropertyChanged, IDataErrorInfo, und vieles mehr). Dann, die ViewModelBase abgeleitet aus der sehr leistungsstarken DataObjectBase Klasse, so können Sie die DataObjectBase für Daten-Objekte und das ViewModelBase für das anzeigen von Modellen.
Es spart auch Sie von der Erstellung boten, da Sie einfach die InterestedIn-Attribut auf einen Blick Modell zu erhalten, ändern Sie Benachrichtigungen von anderen view-Modell.
Ihre beiden Fragen empfehle mir, dass Sie lieber etwas mehr als die View-Modell-Konzept, Geschäftslogik zu definieren.
Den
DelegateCommand
definiert eine separate Klasse abgesehen von den View-Modell. DieObservableObject
ist eine Instanz einer separate Klasse abgesehen von den View-Modell. Dies ist nicht die Regel, sondern die persönliche Präferenz des Augenblicks: das View-Modell ist ausreichend für mich, als ein container für business-Logik, im Bezug auf die visuals. Dies kann verraten meine Vorliebe für MVVM-Licht---die ich finde nicht, fehlt im moment.Ich bin mir nicht ganz sicher, was Los ist in der DataGrid-Beispiel. Was ich sagen kann ist, dass das DataGrid ist nicht sehr flexibel ist---aber in WPF ist das
DataGridTemplateColumn
kann deklarativ binden Sie ein View-Modell zu einer Ansicht (z.B. ein Benutzer-Steuerelement). Also vielleicht dies macht Sinn:RelayCommand
ist auch eine separate Klasse. So istViewModelBase
. Für mein DataGrid Beispiel, vielleicht ist es einfach eine Frage der Terminologie. Ich denke an "Ansicht" -Modelle in MVVM als etwas, das Sie binden, um einen Blick durch den DataContext. Aber ich denke auch, dass man über die view-Modelle für die domain-Objekte (d.h., Entitäten). Zum BeispielPerson
vielleicht eineDateOfBirth
Eigenschaft.PersonViewModel
haben weitere Eigenschaften, wieAge
,IsSelected
(für die Verwendung mit einem DataGrid-check-Kasten-Spalte), undToggleSelectionCommand
(für die Verwendung mit einem DataGrid-button-Spalte).