2009-04-13 8 views
8

Kombination Wenn Muster mit .NET RIA Service und MVVM in Silverlight 3.0 ist ein Unterschied zwischen dem Metadatentyp von RIA Service und das Viewmodel aus dem MVVM? Sind das die gleichen Dinge oder sollten sie getrennt bleiben?.NET RIA Service und MVVM in Silverlight 3.0

Die Metadaten-Typ ist eine abgedichtete interne Klasse der teilweisen Entitätsklasse. Es scheint dort keine korrekte Trennung zu geben, aber der Metadatentyp kann auch mit Attributen für die Validierung versehen werden, wodurch er wie ein ViewModel aussieht.

Ich habe um gesucht, aber ich habe nichts gesehen, das über diese im Detail spricht.

Antwort

11

mit ChuckJ Zustimmen - in der Regel die Domaincontext Teil einer Ansicht Modell bildet. Angenommen, ich hätte eine Suchseite, auf der nach einem Produktkatalog gesucht werden kann. Hier ist, wie ich die Dinge strukturieren würde:

Auf dem Server:

class Catalog : DomainService { 
    IQueryable<Product> GetProducts(string keyword) { ... } 
} 

Die erzeugte Domaincontext:

class Catalog : DomainContext { 
    EntityList<Product> Products { get; } 
    void LoadProducts(string keyword); 
} 

Die Ansicht Modell, das ich schreiben würde:

class SearchViewModel { 
    Catalog _catalog = new Catalog(); 

    public IEnumerable<Product> Results { 
     get { return _catalog.Products; } 
    } 

    public void Search(string keyword) { 
     _catalog.Products.Clear(); 
     _catalog.LoadProducts(keyword); 
    } 
} 

Und Dann würde ich schließlich in meinem XAML den DataContext meines UserControls als eine Instanz von SearchViewModel definieren und ein ItemsContr binden ol zu der Ergebniseigenschaft. Ich würde das ViewModel-Muster Ihrer Wahl verwenden, um einen Button-Klick an Search zu binden (was effektiv ein Befehl ist, den SearchViewModel verfügbar macht). Ich mag persönlich etwas, das ich mit Silverlight.FX wie in der Arbeit:

<Button Content="Search" 
    fxui:Interaction.ClickAction="$model.Search(keywordTextBox.Text)" /> 

und wie anfangs here gezeigt.

Wie Chuck erwähnt, könnte ich tatsächlich anderen Zustand in meinem Ansichtsmodell haben, zum Beispiel das SelectedProduct, das an das SelectedItem einer ListBox in meinem xaml bidirektional gebunden sein kann, und dann dasselbe SelectedProduct binden wie der DataContext von ein DataForm, um Details eines ausgewählten Produkts anzuzeigen.

Hoffe, dass hilft! Ich werde bald darüber mehr über meine blog bloggen.

+0

Nach einigem Nachdenken über die vergangene Woche denke ich, dass ich daran denke. Der DomianContext ist nicht das komplette ViewModel, sondern ein Teil davon.Werden die im MetadataType des DomainService definierten Attribute (wie [Required]) im ViewModel neu deklariert oder ist der DomainContext Teil des ViewModel genug, um von der Validierungsmaschine aufgenommen zu werden? –

+0

Link zu Nikhils Blogbeitrag zum Thema: http://www.nikhilk.net/Entry.aspx?id=229 –

+0

Die Metadatenattribute [Erforderlich] usw. befinden sich in den Entitätstypen - nicht im Ansichtsmodell selbst. Sie werden abgeholt, wenn Sie eine Instanz der Entität aus dem Ansichtsmodell verfügbar machen (z. B. Produkte im obigen Beispiel des Ansichtsmodells). –

1

Die Dienste Daten RIA Kontext die Rolle eines Ansichtsmodelles in dem MVVM Muster zu spielen, wurde entwickelt, da sie die Bindung native Daten unterstützen, aber sie haben nicht diesen Begriff in ihrer Dokumentation verwenden. Es kommt jedoch darauf an. Wahrscheinlich benötigen Sie in Ihrem Ansichtsmodell den Status, den der RIA-Datenkontext bietet, z. B. Befehle und andere Ansichten. Ich denke, Sie möchten die Datenkontexte der RIA-Dienste als Teil des Ansichtsmodells verwenden.

+0

Je mehr ich in sie aussehen Ich glaube, ich will das EntityObject und seine MetadataType so viel wie möglich verbergen. Ich denke, Sie haben recht, dass ich wahrscheinlich den DataContext im ViewModel möchte, aber auch möchte ich die MetaData interne Klasse aus dem EntityObject entfernen und in das ViewModel verschieben. Richtig? –

+0

Warten. Das klingt auch nicht richtig. Ich denke, die MetaData-Klasse muss auf der Serverseite und das ViewModel auf dem Client sein. Pfui. Vielleicht gehört das ViewModel als Shared Code? –

+0

Nach Bewertungen Antworten heute Morgen habe ich endlich realisiert, dass Sie diese Frage beantwortet haben. Hi Chuck, lange nicht gesehen. Hoffe das Leben behandelt dich gut. –