2009-04-13 22 views
8

Al utilizar .NET RIA Services y MVVM en Silverlight 3.0, ¿hay alguna diferencia entre el tipo de metadatos de RIA Services y el ViewModel del patrón MVVM? ¿Son lo mismo o deberían mantenerse separados?Combinación de .NET RIA Services y MVVM en Silverlight 3.0

El tipo de metadata es una clase interna sellada para la clase Entidad parcial. No parece haber una separación adecuada allí, pero el tipo de metadatos también se puede decorar con atributos para la Validación, lo que lo hace parecer un Modelo de Vista.

He buscado pero no he visto nada que describa esto con detalle.

Respuesta

11

De acuerdo con ChuckJ: en general, el DomainContext forma parte de un modelo de vista. Por ejemplo, supongamos que tengo una página de búsqueda que permite buscar en un catálogo de productos. Aquí es cómo me estructuro cosas:

En el servidor:

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

El DomainContext generada:

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

El modelo de vista que iba a escribir:

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

Y luego, finalmente en mi xaml, establecí el DataContext de UserControl para que fuera una instancia de SearchViewModel y uniera un ItemsContr ol a la propiedad Results. Usaría el patrón de ViewModel de su elección para vincular un botón, haga clic en Buscar (que es efectivamente un comando que SearchViewModel expone). Personalmente, me gusta algo que he trabajo con Silverlight.FX como en:

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

y como se muestra inicialmente here.

Como Chuck menciona que podría tener otro estado en mi modelo de vista, por ejemplo, elProducto Seleccionado que podría estar enlazado bidireccionalmente al Elemento Seleccionado de un ListBox en mi xaml, y enlazar el mismoProducto Seleccionado como el DataContext de un DataForm para mostrar detalles de un producto seleccionado.

Espero que ayude! Estaré blogueando sobre esto un poco más en mi blog pronto.

+0

Después de pensar en la semana pasada, creo que esto es lo que estaba pensando. DomianContext no es el ViewModel completo sino parte de él.¿Los atributos definidos en el MetadataType del DomainService (como [Obligatorio]) tienen que redeclararse en el ViewModel o el hecho de que DomainContext es parte del ViewModel lo suficiente como para ser recogido por el motor de validación? –

+0

Enlace al blog de Nikhil del tema: http://www.nikhilk.net/Entry.aspx?id=229 –

+0

Los atributos de metadatos [Obligatorio] etc. están en los tipos de entidad, no en el modelo de vista en sí. Se recogerán si expone una instancia de la entidad del modelo de vista (por ejemplo, Productos en el ejemplo del modelo de vista anterior). –

1

El contexto de datos de servicios de RIA se diseñó para desempeñar el papel de un modelo de vista en el patrón MVVM, ya que admiten de forma nativa el enlace de datos, pero no usan ese término en su documentación. Sin embargo, realmente depende. Es probable que necesite estado en su modelo de vista que el contexto de datos RIA proporciona, como comandos y otro estado relacionado con la vista. Creo que lo que quiere hacer es usar los contextos de datos de los servicios de RIA como parte del modelo de vista.

+0

Cuanto más lo miro, creo que quiero ocultar el EntityObject y su MetaDataType tanto como sea posible. Creo que tiene razón en que probablemente quiera DataContext en ViewModel, pero también quiero eliminar la clase interna MetaData de EntityObject y moverla al ViewModel. ¿Correcto? –

+0

Espera. Eso tampoco suena bien. Creo que la clase MetaData debe estar en el lado del servidor y ViewModel en el Cliente. Ugh. Tal vez el ViewModel pertenece como código compartido? –

+0

Después de las respuestas de los exámenes de esta mañana, finalmente me di cuenta de que respondiste esta pregunta. Hola Chuck, mucho tiempo sin verte. Espero que la vida te esté tratando bien. –

Cuestiones relacionadas