| Una vez que nuestra aplicación web está configurada y exponiendo los datos desde la base de datos, ahora si veremos como consumir el servicio que nos ofrece y como mostrar datos en nuestra aplicación Silverlight. | Indice: Introducción (Parte 1) Obtener datos desde la BD (Parte 2) |
Aplicación Silverlight
Como ya lo hemos comentado, la aplicación silverlight que el template ‘Silverlight Business Application’ no entrega ya cuenta con el ‘Framework de Navegación’. En esta ocasión estaremos trabajando únicamente en nuestra página ‘Home.xaml’.
VS2010 y la Ventana de Fuente de Datos (Data Sources window)
Una de las ventajas que trae consigo el Visual Studio 2010, es que ahora podemos ligar los servicios de datos expuestos por WCF RIA Services en nuestra applicación Silverlight de manera visual; así pues, desde la ventana de ‘Data Sources’ podemos arrastrar un ‘DataGrid’ (que a continuación analizaremos).
La ventana de Data Sources, es lo suficientemente inteligente como para leer los servicios WCF que nuestra aplicación Web expone, y nos entrega los diferentes objetos expuestos.
Ejecutando la aplicación
y listo, ahora sí ya tenemos nuestra primera aplicación RIA Services lista para ser ejecutada. Sin embargo considero importante entendamos que es lo que está pasando tras bambalinas…
Origen de Datos de Dominio (Domain Data Source)
La primera parte del código entregado consiste del control llamado DomainDataSource el cual viene incluido en los assemblies que RIA Services nos entrega.
Este control será el encargado de contener los datos que la aplicación Web expone a través de la Clase de Servicio de Dominio.
- Es generado con un nombre (Name=”productDomainDataSource”),
- utiliza la función de GetProducts (QueryName=”GetProductsQuery”),
- que serán cargado automáticamente (AutoLoad=”True”)
- y al ser cargados los datos, ejecutará el método productDomainDataSource_LoadedData (LoadedData=”productDomainDataSource_LoadedData”)
También es configurado para que el Origen de Datos sea el Contexto de Dominio desde la aplicación Web.
DLL: System.Windows.Controls.DomainServices
Namespace: xmlns:riaControls=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices”
Namespace: xmlns:my=”clr-namespace:WCFRiaServices01.Web.Services”
Namespace: xmlns:my1=”clr-namespace:WCFRiaServices01.Web.Models”
|
1 2 3 4 5 6 7 8 9 10 11 |
<riaControls:DomainDataSource AutoLoad="True"
d:DesignData="{d:DesignInstance my1:Product, CreateList=true}"
Height="0"
LoadedData="productDomainDataSource_LoadedData"
Name="productDomainDataSource"
QueryName="GetProductsQuery"
Width="0">
<riaControls:DomainDataSource.DomainContext>
<my:RiaDomainContext />
</riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource> |
Mostrando los datos en un DataGrid
Una vez que tenemos los datos en nuestro DomainDataSource, estos son mostrados en un control DataGrid.
Nuestro DataGrid tendrá
- un nombre (Name=”productDataGrid”);
- las columnas no serán autogeneradas (AutoGenerateColumns=”False”);
- y lo más importante, el origen de datos estará enlazado con nuestro Domian Data Source (ItemsSource=”{Binding ElementName=productDomainDataSource, Path=Data}”)
DLL: System.Windows.Controls
Namespace: xmlns:sdk=http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk
|
1 2 3 4 5 6 7 8 9 10 |
<sdk:DataGrid AutoGenerateColumns="False"
Height="200"
ItemsSource="{Binding ElementName=productDomainDataSource, Path=Data}"
Name="productDataGrid"
RowDetailsVisibilityMode="VisibleWhenSelected"
Width="400">
<sdk:DataGrid.Columns>
...
</sdk:DataGrid.Columns>
</sdk:DataGrid> |
Y las columnas haran referencia al dato con la propiedad de Binding apuntanto a la columna correspondiente (Binding=”{Binding Path=Class}”)
|
1 2 3 4 |
<sdk:DataGridTextColumn x:Name="classColumn"
Binding="{Binding Path=Class}"
Header="Class"
Width="SizeToHeader" /> |
Las columnas generadas, detectarán el tipo de dato desde la BD, y harán la conversion respectiva, así pues para la fechas se utilizará el formato adecuado. (Esto lo veremos en un post posterior).
Siguientes post…
Aunque ya tenemos una aplicación que corre sobre RIA Services, apenas estamos calentando motores, en los siguientes post estaremos hablando de cómo hacer paginación de los datos mostrados, cómo crear filtros, cómo mostrar los detalles de un registro, etc, etc, etc…
*Puedes ver el post original aqui




6 comments
Froilan says:
Jul 23, 2010
Hola Colega
Los molesto por el siguiente tema: Estoy comenzando a dar los primeros pasos con
Silverlight y me encontré con un par de temitas que me gustaría si me pueden
dar una mano para resolverlos.
El primero es que no encuentro la manera desde el xaml de a partir de un valor
de un campo ( entero ) de una Entidad ( Dispositivo ) poner el Source Correcto
de un control Image; es decir, que si el valor del campo Alarma de la Entidad
Dispositivo es = 0 tengo que poner una imagen y si es = 1 tengo que poner otra.
Espero me puedan dar un norte con esto
El segundo temita donde estoy complicado es el siguiente; Tengo una entidad
Evento que tiene una relación con la entidad Dispositivo, cuando consulto los
datos de la entidad Evento me viene el IDDispositivo, pero necesito mostrar en
un control ListBox en vez del IdDispositivo del Evento, la descripción del
Dispositivo. Mi consulta es como me traigo en la query de la entidad Evento los
datos de los Dispositivos y, en segundo lugar como los puedo mostrar en el
control ListBox
Desde ya muchas Gracias
rodrigo.diaz says:
Jul 26, 2010
Froilan: el primer tema lo resuelves por medio de un Convertidor (clase que implemente IValueConverter). La idea sería convertir de int a Uri, lo cual lo puedes hacer fácilmente con estas clases.
El segundo, necesito un poco más de información: ¿estás usando WCF RIA Services + EF? o cuál es el escenario que tienes?
Salu2!!!
rodrigo.diaz says:
Jul 26, 2010
Te paso un link a un screencast que explica el uso de los Convertidores:
http://channel9.msdn.com/posts/Channel9Mexico/22-Convertidores/
Salu2!
Froilan says:
Aug 10, 2010
Hola Rodrigo
Antes que nada mil Gracias por responder mi consulta, muy amable de tu parte.
Tu respuesta sobre el uso de Convertidores fue de gran ayuda.
Con respecto a la seguda parte, te comento que estoy usando WCF Service + EF y, mis consultas estan referidas al tema de EF. Primero hace rato que estoy buscando una solucion para llevar esta consulta de Sql a una consulta de Entidades de EF
SELECT E.IdEvento, D.Nombre, …..
FROM ( SELECT Max(IDEvento AS ID)
FROM Evento ) AS tmpEvento
INNER JOIN Evento E ON E.IdEvento = tmpEvento.ID
INNEER JOIN Dispositivo D ON E.IdDispositivo = D.IdDispositivo
Tengo las Entidades: Evento y Dipositivo, pero no se como armar el GruopBy y el Join
tengo algo como esto, es decir ya tengo el maximo del Id pero no logro traer los los registros e eventos para cada maximo
var evento1 = context.Eventoes.Include(“Dispositivo”)
.Where(w => w.Dispositivo.IdPlanta == idPlanta)
.GroupBy(t => t.IdDispositivo)
.Select(t => t.Max(c => c.IdEvento))
Otra consulta, una vez que tengo generada las clases del Sevicio, si tengo que arregar una nueva entidad al Modelo de Datos, existe alguna herramienta para volver a generar el Servicio
Jorge Levy says:
Aug 14, 2010
Froilan, respecto a la regeneración de la clase del servicio, desgraciadamente no hay algo que nos lo permita fácilmente, por lo que el camino es borrarla y volverla a generar, situación por la cual la recomendación respecto a los métodos y modificaciones que agregamos o implementamos es hacerlo en una clase parcial…
Saludos…
Carlos Rojas says:
Mar 1, 2011
Hola por favor si me pueden ayudar,,,, tengo en mi modelo de datos la tabla cliente y otroa donde estan sus datos como direccion etc.
Pero en mi lado cliente nesecito mostrar la combinacion de las dos tablas el nombre y la direccion.
como puedo crear una clase que se adjunte al contexto de mi modelo pero con la combinacion de ambas tablas y luego poder mostrarla en silverlight.
Espero me puedan ayudar ….. mi e-mail es i_crojas@hotmail.com
Peru.