RIA Services y DomainDataSource

Seguro que ya todos conocéis los DataSources que tenemos actualmente disponibles en ASP.NET (XmlDataSource, SqlDataSource, ObjectDataSource, EntityDataSource etc…) y lo mucho que nos facilitan el desarrollo.

Pues bien, con RIA Services tendremos uno nuevo; DomainDataSource. Este componente es muy similar al resto de DataSources (la idea es la misma) y nos va permitir trabajar de una manera bastante cómoda y sencilla contra servicios de dominio que se exponen con RIA Services.

Usando este componente que nos ofrece RIA Services y otros que se incluyen dentro de Silverlight 3 el desarrollo de aplicaciones guiadas por datos se va agilizar enormemente en este tipo de aplicaciones.

En este post vamos a ver un ejemplo usando Silverlight aunque tened en cuenta que el componente DomainDataSource también se puede usar en aplicaciones ASP.NET tradicionales o para montar aplicaciones con Dynamic Data, no es algo sólo para Silverlight.

Continuaremos con un ejemplo que vimos en un post anterior. En ese post creábamos una aplicación Silverlight que mostraba un grid con los datos de la tabla de proveedores.

Haciendo uso de Entity Framework y RIA Services exponíamos la entidad Suppliers de la base de datos Northwind y la consumíamos desde un cliente RIA.

EL código que empleaba para enlazar el componente dataGrid con el servidor era el siguiente:

13

A continuación vamos a ver otra alternativa, que es usar el control DomainDataSource, que además de enlazar el datagrid con el servidor nos va a dar, de una manera sencilla, funcionalidades tan típicas como la ordenación, el filtrado o la paginación.

El primer paso es añadir el control DomainDataSource a la caja de herramientas (Choose Toolbox Items>Silverlight Components). Este componente se encuentra en el ensamblado System.Windows.Ria.Controls.dll, que estará úbicado en %ProgramFiles%Microsoft SDKsRIA Servicesv1.0LibrariesSilverlight.

image

Una vez que lo tenemos incluido, ya podemos arrastrarlo a nuestro código XAML.

Añadimos xmlns:ds="clr-namespace:SilverlightApplicationDemo.Web para hacer referencia al dominio que vamos a usar e incluimos el siguiente código, dónde incluimos el control DomainDataSource y el control dataGrid.

<riaControls:DomainDataSource x:Name="suppliersDataSource" LoadSize="20" 
    LoadMethodName="LoadSuppliers" AutoLoad="True" >
    <riaControls:DomainDataSource.DomainContext>
        <ds:SuppliersContext/>
    </riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource>
            
<data:DataGrid Name="gridRiaDemo" Width="Auto"
    ItemsSource="{Binding Data, ElementName=suppliersDataSource}">
</data:DataGrid>

Al dataGrid le indicamos que debe usar el DomainDataSource a través de la propiedad ItemSource y al DomainDataSource le indicamos el dominio que debe usar, en nuestra caso SuppliersContext. También fijaros que en el DomainDataSource indicamos el método al que debe llamar.

Como veis, el control DomainDataSource se comporta y se configura de manera muy similar al resto de DataSources. Por ejemplo, al usar un ObjectDataSource se debe indicar la clase y el método al que hay que llamar….pues en este caso, lo único que cambia es que hay que en lugar de especificar la clase que contiene el método, se indica el DomainContext.

image

Una vez que ya tenemos la funcionalidad básica, podemos ir añadiendo alguna otra.

Si queremos añadir paginación a nuestro grid lo podemos hacer de una manera muy sencilla, haciendo uso del control DataPager de Silverlight:

<dataControls:DataPager PageSize="5" 
    Source="{Binding Data, ElementName=suppliersDataSource}">                    
</dataControls:DataPager>

image

Y si queremos incluir la posibilidad de ordenar nuestro grid cuando pinchamos sobre las columnas? Pues también muy sencillo, ya que el DomainDataSource nos ofrece esta funcionalidad.

Dentro del tag DomainDataSource, justo debajo de la definición del DomainContext añadimos el siguiente código, con la cuál ya soportamos ordenación por cualquiera de las columnas del grid.

<riaControls:DomainDataSource.SortDescriptors>
    <riaData:SortDescriptor PropertyPath="City" Direction="Ascending" />
</riaControls:DomainDataSource.SortDescriptors>

Y ahora toca añadir la funcionalidad de filtrado. Por ejemplo, podríamos tener un textbox para poder indicar el nombre de la ciudad por la que queremos filtrar y en función de las letras que vamos introduciendo, que se vaya filtrando.

image

Dentro del tag DomainDataSource podemos añadir el siguiente código XAML, dónde indicamos que queremos filtrar por el campo City y que queremos buscar las ciudades que empiecen por las letras que introduzcamos en el control cityText.

<riaControls:DomainDataSource.FilterDescriptors>
    <riaData:FilterDescriptorCollection>
        <riaData:FilterDescriptor 
                PropertyPath="City" 
                Operator="StartsWith">
            <riaData:ControlParameter 
                ControlName="cityText"  
                PropertyName="Text" 
                RefreshEventName="TextChanged" />
        </riaData:FilterDescriptor>
    </riaData:FilterDescriptorCollection>
</riaControls:DomainDataSource.FilterDescriptors>

Por si estáis interesado en repetir los ejemplos que os estoy mostrando, recordad que tendréis que añadir alguna definición extra en al inicio del XAML. Aquí os pongo todas las que he usado yo en los ejemplos:

<UserControl 
    xmlns:dataControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm"  
    xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Ria.Controls"  
    xmlns:riaData="clr-namespace:System.Windows.Data;assembly=System.Windows.Ria.Controls"
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  
    x:Class="SilverlightApplicationDemo.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ds="clr-namespace:SilverlightApplicationDemo.Web">

Ibon Landa

bon Landa lleva más de 15 años dedicado al desarrollo de software. Durante este tiempo ha trabajado en diferentes empresas en las cuáles ha podido trabajar en diferentes entornos y tecnologías. Actualmente está focalizado principalmente en tareas de desarrollo, arquitectura, en las herramientas del ciclo de vida y en todo lo relacionado con la plataforma de Cloud Computing Microsoft Azure, área en el que ha sido reconocido como MVP. Participa de forma activa en la comunidad, escribiendo su blog, manteniendo un portal sobre Microsoft Azure y colaborando con Microsoft y grupos de usuarios en eventos de formación, talleres y giras de producto.

7 comentarios en “RIA Services y DomainDataSource”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *