2009-04-13 19 views
8

Podczas korzystania z usług .NET RIA i MVVM w Silverlight 3.0 istnieje różnica między typem metadanych z usług RIA i ViewModel z wzorca MVVM? Czy są to te same rzeczy, czy powinny być oddzielone?Łączenie usług .NET RIA i MVVM w Silverlight 3.0

Typ metadanych jest zamkniętą klasą wewnętrzną dla częściowej klasy Jednostka. Nie wydaje się, aby tam była odpowiednia separacja, ale typ metadanych może być również ozdobiony atrybutami Validation, co sprawia, że ​​wygląda jak ViewModel.

Szukałem w pobliżu, ale nie widziałem niczego, co mówi o tym w szczegółach.

Odpowiedz

11

Zgadzam się z ChuckJ - ogólnie DomainContext stanowi część modelu widoku. Załóżmy na przykład, że mam stronę wyszukiwania, która umożliwia wyszukiwanie w katalogu produktów. Oto jak ja struktury rzeczy:

Na serwerze:

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

Wygenerowany DomainContext:

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

Model widok chciałbym napisać:

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); 
    } 
} 

I następnie w końcu w moim xaml ustawiłem DataContext UserControl na instancję SearchViewModel i związam ItemContr ol do właściwości Results. Chciałbym użyć wybranego wzorca ViewModel, aby powiązać kliknięcie przycisku z wyszukiwaniem (co jest w rzeczywistości poleceniem wyeksponowanym przez SearchViewModel). Ja osobiście lubię coś, że mam pracę z Silverlight.FX jak w:

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

i jak początkowo pokazane here.

Jak wspomina Chuck, mógłbym rzeczywiście mieć inny stan w moim modelu widokowym, na przykład SelectedProduct, który może być dwukierunkowy związany z SelectedItem listBox w moim xaml, a następnie wiązać ten sam SelectedProduct jako DataContext of DataForm, aby wyświetlić szczegóły wybranego produktu.

Nadzieję, że pomaga! Niedługo będę blogować o tym więcej na moim blog.

+0

Po przemyśleniu ostatniego tygodnia myślę, że właśnie o tym myślałem. DomianContext nie jest pełnym ViewModel, ale jego częścią.Czy atrybuty zdefiniowane w MetadataType z DomainService (jak [Wymagane]) będą musiały zostać ponownie zadeklarowane w ViewModel lub fakt, że DomainContext jest częścią ViewModel na tyle, aby zostać pobranym przez silnik sprawdzania poprawności? –

+0

Link do posta na blogu Nikhil na temat: http://www.nikhilk.net/Entry.aspx?id=229 –

+0

Atrybuty metadanych [Wymagane] itd. Są na typach jednostek - nie na samym modelu widoku. Zostaną pobrane, jeśli wystawisz instancję obiektu z modelu widoku (np. Produkty w powyższym przykładzie modelu widoku). –

1

Kontekst danych usług RIA został zaprojektowany w celu odgrywania roli modelu ViewModel w modelu MVVM, ponieważ natywnie obsługują powiązanie danych, ale nie używają tego terminu w swojej dokumentacji. Jednak to naprawdę zależy. Prawdopodobnie będziesz potrzebował stanu w swoim modelu widoku, niż dostarcza kontekst danych RIA, na przykład polecenia i inny stan widoku. Myślę, że chcesz użyć kontekstów danych z usług RIA jako części modelu widoku.

+0

Im bardziej się w to zaglądam, tym bardziej chcę ukryć EntityObject i jego MetaDataType. Myślę, że masz rację, że prawdopodobnie chcę DataContext w ViewModel, ale także chcę usunąć klasę wewnętrzną MetaData z EntityObject i przenieść go do ViewModel. Poprawny? –

+0

Czekaj. To też nie brzmi dobrze. Myślę, że klasa MetaData musi być po stronie serwera i ViewModel na kliencie. Ugh. Może ViewModel należy do wspólnego kodu? –

+0

Po tym, jak opinie dziś rano odpowiadają, w końcu zrozumiałem, że odpowiedziałaś na to pytanie. Cześć Chuck, długo nie widzisz. Życie nadziei traktuje cię dobrze. –

Powiązane problemy