<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Jorge Levy</title>
	
	<link>http://www.jorgelevy.com</link>
	<description>Jorge Levy.- Blog Profesional</description>
	<lastBuildDate>Tue, 29 Mar 2011 00:17:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/JorgeLevy" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="jorgelevy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>WCF Ria Services V1.0 para Silverlight 4.- Guardar datos hacia la Base de Datos (Parte 7)</title>
		<link>http://www.jorgelevy.com/2011/03/wcf-ria-services-v1-0-para-silverlight-4-guardar-datos-hacia-la-base-de-datos-parte-7/</link>
		<comments>http://www.jorgelevy.com/2011/03/wcf-ria-services-v1-0-para-silverlight-4-guardar-datos-hacia-la-base-de-datos-parte-7/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 02:40:05 +0000</pubDate>
		<dc:creator>jorge.levy</dc:creator>
				<category><![CDATA[WCF Ria Services V1.0]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WCF Ria Services]]></category>

		<guid isPermaLink="false">http://www.jorgelevy.com/?p=99</guid>
		<description><![CDATA[Una de las partes más importantes con el trabajo de datos es el poder hacer modificaciones en ellos. Esto incluye añadir nuevos registros, actualizarlos y eliminarlos. En esta ocasión estaremos viendo cómo es posible esto utilizando las características que WCF Ria Services nos ofrece. Con el objetivo de mantener la simplicidad de los post, estaré [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las partes más importantes con el trabajo de datos es el poder hacer modificaciones en ellos. Esto incluye añadir nuevos registros, actualizarlos y eliminarlos. En esta ocasión estaremos viendo cómo es posible esto utilizando las características que WCF Ria Services nos ofrece. <strike></strike></p>
<p><span id="more-99"></span></p>
<p>Con el objetivo de mantener la simplicidad de los post, estaré escribiendo cada acción en un artículo diferente. En este veremos cómo es que funciona la actualización de datos. Esta, la acción que resulta más sencilla de las tres.</p>
<h4>Actualización de datos, del lado del cliente</h4>
<p>Uno de los detalles importantes a considerar en este proceso, es que los elementos que hemos usado para mostrar tanto la lista de registros como el detalle (y debido a que hemos dejado las propiedades en sus valores por default) la actualización de datos ya es posible del lado del cliente. Es decir, por ejemplo, en nuestra <em>vista de detalle del registro</em> podemos cambiar el valor que se muestra.</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices701.png" rel="lightbox"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="WCFRiaServices701" border="0" alt="WCFRiaServices701" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices701_thumb.png" width="644" height="290" /></a></p>
<p>Lo que podemos observar, gracias a que tanto la lista de registros como el detalles están ligado al mismo Domain Data Source, es que al momento de que el TextBox pierde el foco, el dato también es actualizado en la lista de registros.</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices702.png" rel="lightbox"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="WCFRiaServices702" border="0" alt="WCFRiaServices702" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices702_thumb.png" width="644" height="189" /></a></p>
<p>Pero es <strong>IMPORTANTE</strong> hacer notar que estos cambios solo están del lado del cliente. Esto quiere decir que en nuestra base de datos, no se ha hecho ninguna actualización. Así pues, si recargamos la aplicación (F5), podremos observar que los datos son nuevamente traídos desde la base de datos, y que nuestros cambios se han perdido.</p>
<h4>Hacer la actualización en la base datos</h4>
<p>Para hacer la actualización de los cambios hechos del lado del cliente, será necesario hacerlo desde el code behind de nuestro archivo xaml, por lo que agregaremos un botón que nos permita ejecutar un evento donde pondremos el código. Así pues, tendremos un botón con el siguiente codigo xaml:</p>
<pre class="brush: xml;">&lt;Button x:Name=&quot;btnSave&quot;
    Content=&quot;Guardar cambios&quot;
    Height=&quot;23&quot;
    Width=&quot;115&quot;
    HorizontalAlignment=&quot;Left&quot;
    Click=&quot;btnSave_Click&quot; /&gt;</pre>
<p>Es el evento de click donde pondremos nuestro código que indicara a WCF Ria Services que los cambios deberán ser guardados en la base de datos, en este caso al que hemos llamado <em>btnSave_Click</em></p>
<p>La instrucción para que los datos sean guardados, al igual que el resto de nuestras acciones, es de manera muy sencilla, y solo consiste en indicarle al Domain Data Source, que haga un sometimiento de los cambios (submit changes):</p>
<pre class="brush: csharp;">private void btnSave_Click(object sender, System.Windows.RoutedEventArgs e)
{
    productDomainDataSource.SubmitChanges();
}</pre>
<p>Así pues, si verificamos los datos directamente en la base de datos (o si recargamos nuestra aplicación) veremos que los datos efectivamente han sido actualizados.</p>
<h4>Siguientes post…</h4>
<p>Quedan pendientes las otras dos acciones (agregar nuevo registro y eliminar registros) para las siguientes entregas, así como el hecho de regresar a explicar algunas características más sobre la vista de datos.</p>
<p>Gracias y saludos…</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jorgelevy.com/2011/03/wcf-ria-services-v1-0-para-silverlight-4-guardar-datos-hacia-la-base-de-datos-parte-7/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>WCF Ria Services V1.0 para Silverlight 4.- Detalles de un registo (Parte 6)</title>
		<link>http://www.jorgelevy.com/2011/03/wcf-ria-services-v1-0-para-silverlight-4-detalles-de-un-registo-parte-6/</link>
		<comments>http://www.jorgelevy.com/2011/03/wcf-ria-services-v1-0-para-silverlight-4-detalles-de-un-registo-parte-6/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 17:22:46 +0000</pubDate>
		<dc:creator>jorge.levy</dc:creator>
				<category><![CDATA[WCF Ria Services V1.0]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WCF Ria Services]]></category>

		<guid isPermaLink="false">http://www.jorgelevy.com/?p=92</guid>
		<description><![CDATA[Una vez que hemos practicado y entendido como es que podemos mostrar y filtrar datos desde nuestra fuente de datos, no podemos dejar de lado como es que podemos mostrar los detalles de un registro, en este caso el que tenemos seleccionado en nuestra lista de registros. Para poder continuar con este tema, será necesario [...]]]></description>
			<content:encoded><![CDATA[<p>Una vez que hemos practicado y entendido como es que podemos mostrar y filtrar datos desde nuestra fuente de datos, no podemos dejar de lado como es que podemos mostrar los detalles de un registro, en este caso el que tenemos seleccionado en nuestra lista de registros.</p>
<p><span id="more-92"></span></p>
<p>Para poder continuar con este tema, será necesario continuar con el trabajo hemos venido realizando en los <a href="http://www.jorgelevy.com/category/silverlight/wcf-ria-services-v1-0/" target="_blank">post previos</a>, en donde hemos ya generado un lista de registros.</p>
<h4>Vista detalles desde la Ventana de Fuente de Datos.</h4>
<p>Al igual que el datagrid de la lista de datos, la Ventana de Fuente de Datos (Data Sources window) nos permite de manera rápida y fácil crear un vista de detalles. En esta ocasión habremos de seleccionar la vista de detalle en el Data Sources window:</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices601.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices601" border="0" alt="WCFRiaServices601" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices601_thumb.png" width="244" height="197" /></a></p>
<p>Y nuevamente para agregar el elemento, en este caso un grid a dos columnas, necesitamos arrastrar el elemento desde la ventana Data Sources:</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices602.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices602" border="0" alt="WCFRiaServices602" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices602_thumb.png" width="644" height="374" /></a></p>
<h4>Ejecutando la aplicación</h4>
<p>Una vez más, nuestra aplicación está lista para ser ejecutada sin más trabajo que hacer.</p>
<h4>Analizando lo que ha sucedido</h4>
<p>Ahora, como es costumbre, analizaremos lo que ha pasado en el archivo xaml.</p>
<p>Lo primero que podremos apreciar es que el elemento que se ha añadido es un grid con un par de columnas y un renglón por cada uno de los datos del registro que estamos observando en el momento. También hacer notar que Visual Studio 2010 es lo suficientemente inteligente para observar que ya se ha definido un Domain Data Source con la misma fuente de datos, por lo que se lo ha asignado al nuevo grid como su contexto de datos (Data Context). Cada uno de ellos con su respectiva vinculación (binding).</p>
<pre class="brush: xml;">&lt;Grid DataContext=&quot;{Binding ElementName=productDomainDataSource, Path=Data}&quot;
      HorizontalAlignment=&quot;Left&quot;
      Name=&quot;grid1&quot;
      VerticalAlignment=&quot;Top&quot;&gt;
    &lt;Grid.ColumnDefinitions&gt;
        &lt;ColumnDefinition Width=&quot;Auto&quot; /&gt;
        &lt;ColumnDefinition Width=&quot;Auto&quot; /&gt;
    &lt;/Grid.ColumnDefinitions&gt;
    &lt;Grid.RowDefinitions&gt;
        &lt;RowDefinition Height=&quot;Auto&quot; /&gt;
        ...
        &lt;RowDefinition Height=&quot;Auto&quot; /&gt;
    &lt;/Grid.RowDefinitions&gt;
    ...</pre>
<p>Lo que respecta a los renglones, podemos observar una columna para en donde se configura una etiqueta (label) para mostrar el encabezado de la columna en la base de datos y ya sea un TextBox o un DatePicker o un CheckBox para el valor en la base de datos.</p>
<pre class="brush: xml;">...
&lt;sdk:Label Content=&quot;Name:&quot;
           Grid.Column=&quot;0&quot;
           Grid.Row=&quot;8&quot;
           HorizontalAlignment=&quot;Left&quot;
           Margin=&quot;3&quot;
           VerticalAlignment=&quot;Center&quot; /&gt;
&lt;TextBox Grid.Column=&quot;1&quot;
         Grid.Row=&quot;8&quot;
         Height=&quot;23&quot;
         HorizontalAlignment=&quot;Left&quot;
         Margin=&quot;3&quot;
         Name=&quot;nameTextBox&quot;
         Text=&quot;{Binding Path=Name, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, TargetNullValue=''}&quot;
         VerticalAlignment=&quot;Center&quot;
         Width=&quot;120&quot; /&gt;
...
&lt;sdk:Label Content=&quot;Finished Goods Flag:&quot;
           Grid.Column=&quot;0&quot;
           Grid.Row=&quot;4&quot;
           HorizontalAlignment=&quot;Left&quot;
           Margin=&quot;3&quot;
           VerticalAlignment=&quot;Center&quot; /&gt;
&lt;CheckBox Content=&quot;&quot;
          Grid.Column=&quot;1&quot;
          Grid.Row=&quot;4&quot;
          Height=&quot;16&quot;
          HorizontalAlignment=&quot;Left&quot;
          IsChecked=&quot;{Binding Path=FinishedGoodsFlag, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}&quot;
          Margin=&quot;3&quot;
          Name=&quot;finishedGoodsFlagCheckBox&quot;
          VerticalAlignment=&quot;Center&quot; /&gt;
...
&lt;sdk:Label Content=&quot;Modified Date:&quot;
           Grid.Column=&quot;0&quot;
           Grid.Row=&quot;7&quot;
           HorizontalAlignment=&quot;Left&quot;
           Margin=&quot;3&quot;
           VerticalAlignment=&quot;Center&quot; /&gt;
&lt;sdk:DatePicker Grid.Column=&quot;1&quot;
                Grid.Row=&quot;7&quot;
                Height=&quot;23&quot;
                HorizontalAlignment=&quot;Left&quot;
                Margin=&quot;3&quot;
                Name=&quot;modifiedDateDatePicker&quot;
                SelectedDate=&quot;{Binding Path=ModifiedDate, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}&quot;
                VerticalAlignment=&quot;Center&quot;
                Width=&quot;120&quot; /&gt;</pre>
<h4>Siguientes post…</h4>
<p>Si bien, todavía tenemos mucho que decir en lo que respecta a mostrar y filtrar datos, en un siguiente post estaremos hablando de como hacer actualizaciones hacia la base de datos, para posteriormente regresar a mostrar elementos cómo el páginador (data pager) o el indicador de ocupado (busy indicator)</p>
<p>Gracias y saludos…</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jorgelevy.com/2011/03/wcf-ria-services-v1-0-para-silverlight-4-detalles-de-un-registo-parte-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF Ria Services V1.0 para Silverlight 4.- Filtrado datos desde el DomainDataSource (Parte 5)</title>
		<link>http://www.jorgelevy.com/2010/09/wcf-ria-services-v1-0-para-silverlight-4-filtrado-datos-desde-el-domaindatasource-parte-5/</link>
		<comments>http://www.jorgelevy.com/2010/09/wcf-ria-services-v1-0-para-silverlight-4-filtrado-datos-desde-el-domaindatasource-parte-5/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 23:05:31 +0000</pubDate>
		<dc:creator>jorge.levy</dc:creator>
				<category><![CDATA[WCF Ria Services V1.0]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WCF Ria Services]]></category>

		<guid isPermaLink="false">http://www.jorgelevy.com/?p=87</guid>
		<description><![CDATA[Si bien en el post anterior hemos visto como hacer filtrado de datos desde el DomainService, ahora veremos como hacer esto mismo, pero ahora desde el DomainDataSource. El cual se encuentra del lado de la applicación silverlight, además de que nos permitirá hacer modificaciones a los filtros en tiempo de ejecución. Por primera vez en [...]]]></description>
			<content:encoded><![CDATA[<p>Si bien en el <a href="http://www.jorgelevy.com/?p=78">post anterior</a> hemos visto como hacer filtrado de datos desde el DomainService, ahora veremos como hacer esto mismo, pero ahora desde el DomainDataSource. El cual se encuentra del lado de la applicación silverlight, además de que nos permitirá hacer modificaciones a los filtros en tiempo de ejecución.</p>
<p><span id="more-87"></span></p>
<p>Por primera vez en esta serie de post, haremos mas que arrastar y/o seguir asistentes. En esta ocasión la codificación estará en nuestro archivo xaml. Y para poder trabajar en este tema, será necesario tener nuestro código como lo tendriamos en la <a href="http://www.jorgelevy.com/?p=69">parte 3</a> de esta serie.</p>
<p><font size="3"><em>WCF Ria Services V1.0 para Silverlight 4.- Índice: </em>      <br /></font><a href="http://www.jorgelevy.com/?p=37">Introducción (Parte 1)</a>     <br /><a href="http://www.jorgelevy.com/?p=44">Obtener datos desde la BD (Parte 2)</a>     <br /><a href="http://www.jorgelevy.com/?p=69">Mostrar datos (Parte 3)</a>     <br /><a href="http://www.jorgelevy.com/?p=78">Filtrar datos [DomainService] (Parte 4)</a>     <br />Filtrar datos [DomainDataSource] (Parte 5)</p>
</td>
<h4>Texto a filtrar (preparando el filtro)</h4>
<p>Para saber que texto es el que aplicaremos agregaremos un campo de text (TextBox) a nuestra interface al cual necesita llevar nombre (x:name)</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices501.png" rel="lightbox"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="WCFRiaServices501" border="0" alt="WCFRiaServices501" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices501_thumb.png" width="644" height="317" /></a></p>
<p>El código quedaría como:</p>
<pre class="brush: xml;">&lt;TextBox x:Name=&quot;txtFilter&quot;
         Width=&quot;350&quot; /&gt;
&lt;sdk:DataGrid AutoGenerateColumns=&quot;False&quot;
              Height=&quot;200&quot;
              ItemsSource=&quot;{Binding ElementName=productDomainDataSource, Path=Data}&quot;
              Name=&quot;productDataGrid&quot;
              RowDetailsVisibilityMode=&quot;VisibleWhenSelected&quot;
              Width=&quot;400&quot;&gt;
    &lt;sdk:DataGrid.Columns&gt;
        &lt;sdk:DataGridTextColumn x:Name=&quot;nameColumn&quot;
            ...</pre>
<h4>Modificando el Servicio de Dominio (DomainService)</h4>
<p>Para poder realizar los filtros será necesario agregar un Descriptor de Filtros (FilterDescriptor) a nuestro Servicio de Dominio (DomainService). Será en el FilterDescriptor donde configuraremos el tipo de operaror que el filtro utilizará (Operator=&quot;StartsWith&quot;), así como la columna en la que se aplicará el filtro con la propiedad de PropertyPath (PropertyPath=&quot;Name&quot;), y el valor que será utilizado como filtro, el cual en esta ocasión será un mapeo al texto del campo de texto que agregamos anteriormente (Value=&quot;{Binding ElementName=txtFilter, Path=Text}&quot;).</p>
<pre class="brush: xml;">&lt;riaControls:DomainDataSource AutoLoad=&quot;True&quot;
                              d:DesignData=&quot;{d:DesignInstance my1:Product, CreateList=true}&quot;
                              Height=&quot;0&quot;
                              LoadedData=&quot;productDomainDataSource_LoadedData&quot;
                              Name=&quot;productDomainDataSource&quot;
                              QueryName=&quot;GetProductsQuery&quot;
                              Width=&quot;0&quot;&gt;
    &lt;riaControls:DomainDataSource.DomainContext&gt;
        &lt;my:RiaDomainContext /&gt;
    &lt;/riaControls:DomainDataSource.DomainContext&gt;
    &lt;riaControls:DomainDataSource.FilterDescriptors&gt;
        &lt;riaControls:FilterDescriptor Operator=&quot;StartsWith&quot;
                                      PropertyPath=&quot;Name&quot;
                                      Value=&quot;{Binding ElementName=txtFilter, Path=Text}&quot; /&gt;
    &lt;/riaControls:DomainDataSource.FilterDescriptors&gt;
&lt;/riaControls:DomainDataSource&gt;</pre>
<h4>Ejecutando la aplicación</h4>
<p>Al ejecutar este applicación podremos observar que el filtro es aplicado segun vamos escribiendo en el cuadro de texto, a diferencia de cuando creamos el filtro en el DomainService, que el filtro es aplicado al presionar el boton de &quot;Load&quot;.</p>
<p><font size="1">Nota: es posible tener un retraso en la carga de datos, por lo que es probable que mientras los datos son cargado, el filtro no se aplique como lo esperamos, pero una vez cargados los datos, el filtro trabajará adecuadamente. En nuestro siguiente post veremos como agregar un control (Busy) que nos permita saber si hay actividad en la carga de datos.</font></p>
<p>Saludos…</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jorgelevy.com/2010/09/wcf-ria-services-v1-0-para-silverlight-4-filtrado-datos-desde-el-domaindatasource-parte-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF Ria Services V1.0 para Silverlight 4.- Filtrar datos desde el DomainService (Parte 4)</title>
		<link>http://www.jorgelevy.com/2010/08/wcf-ria-services-v1-0-para-silverlight-4-filtrar-datos-desde-el-domainservice-parte-4/</link>
		<comments>http://www.jorgelevy.com/2010/08/wcf-ria-services-v1-0-para-silverlight-4-filtrar-datos-desde-el-domainservice-parte-4/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 23:16:34 +0000</pubDate>
		<dc:creator>jorge.levy</dc:creator>
				<category><![CDATA[WCF Ria Services V1.0]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WCF Ria Services]]></category>

		<guid isPermaLink="false">http://www.jorgelevy.com/?p=78</guid>
		<description><![CDATA[Ahora bien, una vez que hemos enlistado la información desde la base datos, en esta entrada veremos cómo filtrar este resultado, es decir, mostrar solo los datos que cumplen cierto criterio. Índice: Introducción (Parte 1) Obtener datos desde la BD (Parte 2) Mostrar datos (Parte 3) Filtrar datos [DomainService] (Parte 4) Modificando el Servicio de [...]]]></description>
			<content:encoded><![CDATA[<table border="0" cellspacing="0" cellpadding="2" width="506">
<tbody>
<tr>
<td valign="bottom" width="285"><em>Ahora bien, una vez que hemos enlistado la información desde la base datos, en esta entrada veremos cómo filtrar este resultado, es decir, mostrar solo los datos que cumplen cierto criterio.</em></td>
<td valign="top" width="220" align="right">Índice:          <br /><a href="http://www.jorgelevy.com/?p=37">Introducción (Parte 1)</a>           <br /><a href="http://www.jorgelevy.com/?p=44">Obtener datos desde la BD (Parte 2)</a>           <br /><a href="http://www.jorgelevy.com/?p=69">Mostrar datos (Parte 3)</a>           <br />Filtrar datos [DomainService] (Parte 4)</td>
</tr>
</tbody>
</table>
<p><span id="more-78"></span></p>
<h4>Modificando el Servicio de Dominio (DomainService)</h4>
<p>En la <a href="http://www.jorgelevy.com/?p=44" target="_blank">parte 2</a>, de esta serie de post, agregamos nuestra Clase de Servicio de Dominio, la cual llamamos RiaDomainService.cs. Esta clase, como ya lo explicábamos, es la encargada de exponer las diferentes acciones que podemos ejecutar desde y hacia nuestros datos.</p>
<p>El primer paso que haremos es agregar un nuevo método que nos permita filtrar los datos. Al hacerlo de esta manera, el filtrado de datos lo estaremos haciendo en la capa media, que bien podríamos ver como la capa de negocio (business).</p>
<p>Básicamente nuestro método será muy parecido al método que ya tenemos para obtener la lista de productos, pero este nuevo método recibirá un parámetro el cual usaremos para el filtrado de datos. En esta ocasión lo que haremos es filtrar los datos por los registros que comiencen con el texto que el usuario decida sobre la columna de nombre de producto.</p>
<p>El método lo llamaremos <em>GetProductsStartingWith</em>, y recibirá un texto como parámetro el cual llamaremos <em>startingName</em>. Y los datos serán filtrados utilizando el método <em>Where()</em> que nuestro modelo de datos no entrega, en el cual utilizaremos expresiones lambda.</p>
<pre class="brush: csharp;">public IQueryable&lt;Product&gt; GetProductsStartingWith(string startingName)
{
    return this.ObjectContext.Products.Where(p =&gt; p.Name.StartsWith(startingName));
}</pre>
<h4>Vista y Ventana de Fuente de Datos (Data Sources Window)</h4>
<p>Al igual que cuando agregamos la lista de productos, el Data Source Window nos permite agregar los controles que en esta ocasión serán necesarios para mostrar la lista filtrada; el DataGrid, un cuadro de texto, y un botón, es una sola acción.</p>
<p>Para lograr esto, en el Data Source Window necesitamos indicar que para la lista de productos, el query a utilizar será <em>GetProductsByNameQuery</em>.</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices401.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices401" border="0" alt="WCFRiaServices401" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices401_thumb.png" width="244" height="198" /></a></p>
<p><font size="1">* Si el query no está disponible, es probable que necesitemos recompilar nuestra solución una vez que agregamos el nuevo método a nuestro DomainService, o presionar el icono de recargar disponible en la ventana de Data Source.</font></p>
<p>Una vez que hemos seleccionado el query solo bastará arrastrar el elemento a nuestro xaml.</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices402.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices402" border="0" alt="WCFRiaServices402" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices402_thumb.png" width="644" height="300" /></a></p>
<h4>Ejecutando la aplicación</h4>
<p>Nuevamente, nuestra aplicación ya está terminada con apenas estos pequeños pasos que hemos hecho.</p>
<p>Aquí la explicación de lo que ha sucedido en nuestro archivo xaml.</p>
<h4>Los elementos agregados: un <em>DomainDataSource, </em>un <em>DataGrid</em>, un <em>Label</em>, un <em>TextBox</em>, y un <em>Butto</em><em>n.</em></h4>
<p>El primer elemento que necesitamos analizar es el DomainDataSource. Éste tiene los valores de acuerdo a:</p>
<ul>
<li>Es generado con un nombre (<em>Name=”productDomainDataSource”</em>), </li>
<li>utiliza la función de GetProducts (<em>QueryName=&quot;GetProductsByNameQuery&quot;</em>), </li>
<li>que no serán cargado automáticamente (<em>AutoLoad=&quot;False&quot;</em>) </li>
<li>y al ser cargados los datos, ejecutará el método productDomainDataSource_LoadedData (<em>LoadedData=&quot;productDomainDataSource_LoadedData&quot;</em>) </li>
</ul>
<p>Adicionalmente, al DomainDataSource se le ha agregado un elemento llamado <em>QueryParameters</em>, el cual nos permite enviarle los parámetros pertinentes al query que estamos ejecutando, que en esta ocasión será:</p>
<ul>
<li>el parámetro startingName (<em>ParameterName=&quot;startingName&quot;</em>) </li>
<li>cual será leído desde el textbox startingNameTextBox<em>, </em>que también ha sido agregado y analizaremos más adelante (<em>Value=&quot;{Binding ElementName=startingNameTextBox, Path=Text}&quot;</em>). </li>
</ul>
<pre class="brush: xml;">&lt;riaControls:DomainDataSource AutoLoad=&quot;False&quot;
                              d:DesignData=&quot;{d:DesignInstance my1:Product, CreateList=true}&quot;
                              Height=&quot;0&quot;
                              LoadedData=&quot;productDomainDataSource_LoadedData&quot;
                              Name=&quot;productDomainDataSource&quot;
                              QueryName=&quot;GetProductsStartingWithQuery&quot;
                              Width=&quot;0&quot;&gt;
    &lt;riaControls:DomainDataSource.DomainContext&gt;
        &lt;my:RiaDomainContext /&gt;
    &lt;/riaControls:DomainDataSource.DomainContext&gt;
    &lt;riaControls:DomainDataSource.QueryParameters&gt;
        &lt;riaControls:Parameter ParameterName=&quot;startingName&quot;
                               Value=&quot;{Binding ElementName=startingNameTextBox, Path=Text}&quot; /&gt;
    &lt;/riaControls:DomainDataSource.QueryParameters&gt;
&lt;/riaControls:DomainDataSource&gt;</pre>
<p>Además, como lo podemos observar, se han agregado un <em>Label</em>, un <em>Textbox</em>, un <em>Button</em> y un <em>DataGrid</em>, los cuales son muy intuitivos en su función. Básicamente el texto que el usuario escriba en el <em>TextBox</em> servirá como filtro de los datos a mostrar en el <em>DataGrid</em>, una vez presionado el <em>Button.</em> Y esto es ejecutado ya que se ha agregado un enlace (Binding) al Domain Data Source (<em>Command=&quot;{Binding Path=LoadCommand, ElementName=productDomainDataSource}&quot;</em>)</p>
<pre class="brush: xml;">&lt;StackPanel Height=&quot;30&quot;
            Orientation=&quot;Horizontal&quot;&gt;
    &lt;sdk:Label Content=&quot;Starting Name:&quot;
               Margin=&quot;3&quot;
               VerticalAlignment=&quot;Center&quot; /&gt;
    &lt;TextBox Name=&quot;startingNameTextBox&quot;
             Width=&quot;60&quot; /&gt;
    &lt;Button Command=&quot;{Binding Path=LoadCommand, ElementName=productDomainDataSource}&quot;
            Content=&quot;Load&quot;
            Margin=&quot;3&quot;
            Name=&quot;productDomainDataSourceLoadButton&quot; /&gt;
&lt;/StackPanel&gt;</pre>
<h4>Otra forma de hacer filtros…</h4>
<p>En el siguiente post, veremos cómo hacer filtrados de datos desde nuestro DomainDataSource, esto sin necesidad de modificar nuestros Servicios de Dominio…</p>
<p>Saludos…</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jorgelevy.com/2010/08/wcf-ria-services-v1-0-para-silverlight-4-filtrar-datos-desde-el-domainservice-parte-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF Ria Services V1.0 para Silverlight 4.- Mostar datos (Parte 3)</title>
		<link>http://www.jorgelevy.com/2010/07/wcf-ria-services-v1-0-para-silverlight-4-mostar-datos-parte-3/</link>
		<comments>http://www.jorgelevy.com/2010/07/wcf-ria-services-v1-0-para-silverlight-4-mostar-datos-parte-3/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 22:14:07 +0000</pubDate>
		<dc:creator>jorge.levy</dc:creator>
				<category><![CDATA[WCF Ria Services V1.0]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WCF Ria Services]]></category>

		<guid isPermaLink="false">http://www.jorgelevy.com/?p=69</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<table border="0" cellspacing="0" cellpadding="2" width="505">
<tbody>
<tr>
<td valign="top" width="285">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.</td>
<td valign="top" width="220" align="right">Indice:          <br /><a href="http://www.jorgelevy.com/?p=37">Introducción (Parte 1)</a>           <br /><a href="http://www.jorgelevy.com/?p=44">Obtener datos desde la BD (Parte 2)</a></td>
</tr>
</tbody>
</table>
<p><span id="more-69"></span></p>
<h4>Aplicación Silverlight</h4>
<p>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’.</p>
<h4>VS2010 y la Ventana de Fuente de Datos (Data Sources window)</h4>
<p>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 &#8216;Data Sources&#8217; podemos arrastrar un &#8216;DataGrid&#8217; (que a continuación analizaremos).</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices301.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices301" border="0" alt="WCFRiaServices301" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices301_thumb.png" width="644" height="303" /></a></p>
<p>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.</p>
<h4>Ejecutando la aplicación</h4>
<p>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…</p>
<h4>Origen de Datos de Dominio (Domain Data Source)</h4>
<p>La primera parte del código entregado consiste del control llamado DomainDataSource el cual viene incluido en los assemblies que RIA Services nos entrega.</p>
<p>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.</p>
<ul>
<li>Es generado con un nombre (<em>Name=”productDomainDataSource”</em>), </li>
<li>utiliza la función de GetProducts (<em>QueryName=&quot;GetProductsQuery&quot;</em>), </li>
<li>que serán cargado automáticamente (<em>AutoLoad=&quot;True&quot;</em>) </li>
<li>y al ser cargados los datos, ejecutará el método productDomainDataSource_LoadedData (<em>LoadedData=&quot;productDomainDataSource_LoadedData&quot;</em>) </li>
</ul>
<p>También es configurado para que el Origen de Datos sea el Contexto de Dominio desde la aplicación Web.</p>
<p><em>DLL</em>: <span style="font-family: century; font-size: xx-small">System.Windows.Controls.DomainServices</span>     <br /><em>Namespace</em>: <span style="font-family: century; font-size: xx-small">xmlns:riaControls=&quot;clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices&quot;</span>     <br /><em>Namespace</em>: <span style="font-family: century; font-size: xx-small">xmlns:my=&quot;clr-namespace:WCFRiaServices01.Web.Services&quot;</span>     <br /><em>Namespace</em>: <span style="font-family: century; font-size: xx-small">xmlns:my1=&quot;clr-namespace:WCFRiaServices01.Web.Models&quot;</span></p>
<pre class="brush: xml;">&lt;riaControls:DomainDataSource AutoLoad=&quot;True&quot;
                              d:DesignData=&quot;{d:DesignInstance my1:Product, CreateList=true}&quot;
                              Height=&quot;0&quot;
                              LoadedData=&quot;productDomainDataSource_LoadedData&quot;
                              Name=&quot;productDomainDataSource&quot;
                              QueryName=&quot;GetProductsQuery&quot;
                              Width=&quot;0&quot;&gt;
    &lt;riaControls:DomainDataSource.DomainContext&gt;
        &lt;my:RiaDomainContext /&gt;
    &lt;/riaControls:DomainDataSource.DomainContext&gt;
&lt;/riaControls:DomainDataSource&gt;</pre>
<h4>Mostrando los datos en un DataGrid</h4>
<p>Una vez que tenemos los datos en nuestro DomainDataSource, estos son mostrados en un control DataGrid.</p>
<p>Nuestro DataGrid tendrá</p>
<ul>
<li>un nombre (<em>Name=&quot;productDataGrid&quot;</em>); </li>
<li>las columnas no serán autogeneradas (<em>AutoGenerateColumns=&quot;False&quot;</em>); </li>
<li>y lo más importante, el origen de datos estará enlazado con nuestro Domian Data Source (<em>ItemsSource=&quot;{Binding ElementName=productDomainDataSource, Path=Data}&quot;</em>) </li>
</ul>
<p><em>DLL</em>: <span style="font-family: century; font-size: xx-small">System.Windows.Controls</span></p>
<p><span style="font-family: century; font-size: xx-small"></span><em>Namespace</em>: <span style="font-family: century; font-size: xx-small">xmlns:sdk=http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk</span> </p>
<p></p>
<pre class="brush: xml;">&lt;sdk:DataGrid AutoGenerateColumns=&quot;False&quot;
              Height=&quot;200&quot;
              ItemsSource=&quot;{Binding ElementName=productDomainDataSource, Path=Data}&quot;
              Name=&quot;productDataGrid&quot;
              RowDetailsVisibilityMode=&quot;VisibleWhenSelected&quot;
              Width=&quot;400&quot;&gt;
    &lt;sdk:DataGrid.Columns&gt;
        ...
    &lt;/sdk:DataGrid.Columns&gt;
&lt;/sdk:DataGrid&gt;</pre>
<p>Y las columnas haran referencia al dato con la propiedad de Binding apuntanto a la columna correspondiente (<em>Binding=&quot;{Binding Path=Class}&quot;</em>)</p>
<pre class="brush: xml;">&lt;sdk:DataGridTextColumn x:Name=&quot;classColumn&quot;
                        Binding=&quot;{Binding Path=Class}&quot;
                        Header=&quot;Class&quot;
                        Width=&quot;SizeToHeader&quot; /&gt;</pre>
<p>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).</p>
<h4>Siguientes post…</h4>
<p>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…</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jorgelevy.com/2010/07/wcf-ria-services-v1-0-para-silverlight-4-mostar-datos-parte-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF Ria Services V1.0 para Silverlight 4.- Obtener datos desde la BD (Parte 2)</title>
		<link>http://www.jorgelevy.com/2010/07/wcf-ria-services-v1-0-para-silverlight-4-obtener-datos-desde-la-bd-parte-2/</link>
		<comments>http://www.jorgelevy.com/2010/07/wcf-ria-services-v1-0-para-silverlight-4-obtener-datos-desde-la-bd-parte-2/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 22:11:25 +0000</pubDate>
		<dc:creator>jorge.levy</dc:creator>
				<category><![CDATA[WCF Ria Services V1.0]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WCF Ria Services]]></category>

		<guid isPermaLink="false">http://www.jorgelevy.com/?p=44</guid>
		<description><![CDATA[Y bien, después de nuestro post de introducción, en éste abordaremos como comenzar a trabajar con Ria Services para obtener los información desde la base de datos, y como mostrarlos en nuestra aplicación Silverlight. Indice: Introducción (Parte 1) Plantilla de VS2010 para WCF Ria Sercvices Lo primero que necesitamos mencionar es que el framework de [...]]]></description>
			<content:encoded><![CDATA[<table border="0" cellspacing="0" cellpadding="2" width="505">
<tbody>
<tr>
<td valign="top" width="285">Y bien, después de nuestro post de introducción, en éste abordaremos como comenzar a trabajar con Ria Services para obtener los información desde la base de datos, y como mostrarlos en nuestra aplicación Silverlight.</td>
<td valign="top" width="220" align="right">Indice:          <br /> <a href="http://www.jorgelevy.com/?p=37">Introducción (Parte 1)</a></td>
</tr>
</tbody>
</table>
<p><span id="more-44"></span></p>
<h4>Plantilla de VS2010 para WCF Ria Sercvices</h4>
<p>Lo primero que necesitamos mencionar es que el framework de Ria Services nos ofrece una plantilla (template) para VS2010 llamada &#8216;Silverlight Business Appication&#8217; que nos entregará una solución totalmente configurada para comenzar a trabajar. Esta solución viene ya incluso con las siguientes características:</p>
<ul>
<li>La solución está compuesta por dos proyectos, una aplicación web y una aplicación Silverlight. La aplicación web será la encargada de la conexión y acceso a la base datos, así como la que proyectará los datos hacia la aplicación silverlight, que será la que le de vista a estos. </li>
<li>La aplicación Silverlight que nos entrega está creada sobre el framework de navegación (<a href="http://www.jorgelevy.com/index.php/category/silverlight/framework-de-navegacion/">para leer sobre el Framework de Navegación puedes ir a estos post</a>) </li>
<li>Servicios de manejo de usuarios (membership) ya están incluido. (estos los veremos cómo usar y modificar en un post posterior) </li>
</ul>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices201.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices201" border="0" alt="WCFRiaServices201" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices201_thumb.png" width="644" height="397" /></a></p>
<h4>Modelo de Datos</h4>
<p>Para poder acceder a los datos desde nuestra aplicación Silverlight, es necesario crear &quot;<em>en nuestra aplicación web&quot;</em> un modelo de datos y proyectarlos desde nuestra aplicación web con una clase de servicio de dominio.</p>
<p>Lo primero que haremos es crear un modelo de nuestra base datos. Esto será, como ya lo hemos mencionado, del lado de nuestra aplicación web. En esta ocasión agregaremos un nuevo elemento del tipo &#8216;ADO.NET Entity Data Model&#8217;. Le pondremos por nombre &#8216;RIAModel.edmx&#8217;. (Como sugerencia, la pondremos en la carpeta &#8216;Models&#8217;)</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices202.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices202" border="0" alt="WCFRiaServices202" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices202_thumb.png" width="644" height="444" /></a></p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices203.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices203" border="0" alt="WCFRiaServices203" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices203_thumb.png" width="644" height="399" /></a></p>
<p>Esto nos lanzará un asistente. En el primer paso nos permitirá seleccionar el contenido de nuestro modelo, en esta ocasión seleccionaremos que sea generado desde una base de datos.</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices204.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices204" border="0" alt="WCFRiaServices204" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices204_thumb.png" width="544" height="484" /></a></p>
<p>En el siguiente paso del asistente configuraremos los datos de conexión de la base de datos.</p>
<p><font size="1">*Yo usaré la base de datos de AdventureWorks sample databases que pueden encontrar en el web para su </font><a href="http://msftdbprodsamples.codeplex.com/releases/view/45907" target="_blank"><font size="1">descarga</font></a><font size="1">.</font></p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices205.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices205" border="0" alt="WCFRiaServices205" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices205_thumb.png" width="542" height="484" /></a></p>
<p>En el tercer paso del asistente, seleccionaremos los objetos que queremos estén incluidos en modelo de datos. Además configuraremos el Namespace del Modelo.</p>
<p><font size="1">*Para nuestros propósitos por ahora solo seleccionaremos la tabla de Product (Production), y nombraremos el Namespace del Modelo como: RiaModel</font></p>
<p>Al seleccionar la opción de pluralizar o singularizar lo nombre de los objectos generados (Pluraliza or singularize generated object names), le estamos diciendo al modelo que los objetos deberan tener el nombre de entidad en plural y el nombre en singular, lo cual nos ayudará a entender posteriormente de una mejor manera con que tipo de objeto estamos trabajando al hacer consultas a los datos.</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices206.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices206" border="0" alt="WCFRiaServices206" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices206_thumb.png" width="541" height="484" /></a></p>
<p>Al terminar el asistente tendremos un esquema del modelo de datos como este. Observemos que el &#8216;Entity Set Name&#8217; esta pluralizado.</p>
<p>&#160;<a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices207.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices207" border="0" alt="WCFRiaServices207" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices207_thumb.png" width="426" height="484" /></a>     <br /> Una vez completado nuestro modelo, <em>tendremos que compilar el proyecto</em>, ya que para la siguiente sección, es necesario tener nuestro modelo de datos ya disponible.</p>
<h4>Clase de Servicio de Dominio</h4>
<p>El siguiente paso en el que trabajaremos será el encargado de proyectar los datos desde nuestra aplicación web hacia nuestra aplicación silverlight. Y esto lo lograremos agregando un elemento del tipo ‘Domain Services Class’, el cual añadiremos a nuestro proyecto web en la carpeta llamada ‘Services’, lo cual haremos en la carpeta de Services y lo llamaremos RiaDomainService.cs</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices208.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices208" border="0" alt="WCFRiaServices208" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices208_thumb.png" width="644" height="446" /></a></p>
<p>Al agregar este tipo de clases, nos lanzará un asistente que nos permitirá seleccionar los elementos configurados en nuestro Modelo de Datos que queremos sean proyectados por medio de un servicio, así como una opción para permitir sean editados. Además de que también nos ofrece la opción de crear las clases asociadas para los metadatos de los objetos (dedicaremos un post a este tema).</p>
<p><font size="1">*Si no se muestra ninguno de los elementos configurados anteriormente es probable que el proyecto no fuera compilado previamente.</font></p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices2091.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="WCFRiaServices209" border="0" alt="WCFRiaServices209" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/WCFRiaServices209_thumb1.png" width="397" height="484" /></a></p>
<p>Los elementos que nos entregará serán un par de clases, en mi caso: RiaDomainService.cs y RiaDomainService.metadata.cs. Como lo comenté, la segunda de ellas la abordaremos con mayor detalle en un post posterior. Pero de la que si necesitamos hablar es de la de RiaDomainService.cs.</p>
<p>Lo que podemos platicar hasta este momento de esta clase es que:</p>
<ol>
<li>Como podemos ver, está etiquetada con [EnableClientAccess()], ya que pedimos fuera editable. </li>
<li>Nos crea 4 funciones básicas: GetProducts(), InsertProducts(), UpdateProducts() y DeleteProducts(). El típico ABC de una base de datos. </li>
<li>Esta clase es 100% modificable para nuestros propósitos. Así pues por ejemplo, si quisiéramos que nuestro método GetProducts() nos regrese los registros de manera ordenada, solo bastaría modificarla de tal modo que quedaría: </li>
</ol>
<pre class="brush: csharp;">public IQueryable&lt;Product&gt; GetProducts()
{
    return this.ObjectContext.Products.OrderBy(p =&gt; p.Name);
}</pre>
<h4>Continuará…</h4>
<p>Ya hemos configurado nuestra aplicación web para proyectar los datos, en nuestro siguiente post ahora sí comenzaremos a consumir estos datos y a mostrarlos desde nuestra aplicación silverlight…</p>
<p>Saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jorgelevy.com/2010/07/wcf-ria-services-v1-0-para-silverlight-4-obtener-datos-desde-la-bd-parte-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WCF Ria Services V1.0 para Silverlight 4.- Introducción (Parte 1)</title>
		<link>http://www.jorgelevy.com/2010/07/wcf-ria-services-v1-0-para-silverlight-4-introduccin-parte-1/</link>
		<comments>http://www.jorgelevy.com/2010/07/wcf-ria-services-v1-0-para-silverlight-4-introduccin-parte-1/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 22:05:41 +0000</pubDate>
		<dc:creator>jorge.levy</dc:creator>
				<category><![CDATA[WCF Ria Services V1.0]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WCF Ria Services]]></category>

		<guid isPermaLink="false">http://www.jorgelevy.com/?p=37</guid>
		<description><![CDATA[Este es el primero de varios post que estaré escribiendo referente al tema de WCF Ria Services v1.0 para Silvelight 4. Si bien el tema ha sido abordado en muchas páginas y blogs, la mayoría de ellos están en inglés, así que aquí una propuesta en español. Además de que trataré de hacerlo de manera [...]]]></description>
			<content:encoded><![CDATA[<p><em>Este es el primero de varios post que estaré escribiendo referente al tema de WCF Ria Services v1.0 para Silvelight 4. Si bien el tema ha sido abordado en muchas páginas y blogs, la mayoría de ellos están en inglés, así que aquí una propuesta en español. Además de que trataré de hacerlo de manera ordenada y sencilla de tal modo que sea entendible (o al menos en la forma en la que yo he ido aprendiendo sobre el tema).</em></p>
<p><span id="more-37"></span></p>
<p>Si bien, ya habia comenzado una <strike>Serie de post sobre WCF Ria Services</strike>, me he decidido a comenzar nuevamente con el tema por las siguientes razones:</p>
<ul>
<li>El lanzamiento oficial de la versión RTM de Visual Studio 2010 </li>
<li>El lanzamiento oficial de Silverlight 4 </li>
<li><a href="http://blogs.ligasilverlight.com/2010/05/wcf-ria-services-v1-0/" target="_blank">El lanzamiento oficial WCF Ria Services v1.0</a> </li>
<li>Ademas de que durante este tiempo he estado trabajando muy de lleno en un sitio (razón por la cual dejé de lado la continuación de la serie antes mencionada), en donde mi experiencia ha sido enfocada a la tecnología de WCF Ria Services, por lo que los conocimiento adquiridos me han hecho ver el tema con diferentes ojos. </li>
</ul>
<p>Y como podrán darse cuenta, creo conveniente recomenzar con el proyecto de aportar con mi granito de arena sobre el tema. Sin embargo, <em>como lo que fuimos es lo que nos hacer ser lo que somos</em>, tomaré mucha de la información y forma de lo que en la antigua serie trate de hacer.</p>
<h4>Que es WCF Ria Services?</h4>
<p>Ria Services es un framework que provee una serie de funcionalidades (dlls, templates, etc) que permiten acceder datos en una Aplicación Silverlight desde una Base de Datos. Esto es gracias a su implementación en modelo de capas (n-tier application), donde Ria Services trabaja en las capas intermedias ofreciendo control de acceso, cambios y operaciones definidas por el usuario, así como funciones de de validaciones, autentificación de usuarios y roles en las capas superiores.</p>
<p>Referencia: <a href="http://silverlight.net/riaservices/">http://silverlight.net/riaservices/</a></p>
<h4>Página WCF Ria Services, instaladores y recursos de aprendizaje</h4>
<p>La principal página de WCF Ria Services la podemos encontrar en <a href="http://www.silverlight.net/riaservices">http://www.silverlight.net/riaservices</a>. En donde podemos encontrar los instaladores. Así como una serie de recursos de aprendizaje (videos, documentos, blogs, etc).</p>
<h4>Recursos para trabajar en Ria Services</h4>
<p>Hacer notar WCF Ria Services ya está incluido en el instalador de las herramientas de <a href="http://go.microsoft.com/fwlink/?LinkID=177508" target="_blank">Silverlight 4 para Visual Studio 2010 (Silverlight 4 Tools for Visual Studio 2010)</a>. Sin embargo en la página podemos encontrar el instalador standalone para la <a href="http://go.microsoft.com/fwlink/?LinkID=169231" target="_blank">versión v1.0 de WCF Ria Services</a>, así como el instalador para el <a href="http://go.microsoft.com/fwlink/?LinkId=185121" target="_blank">paquete de herramientas de WCF Ria Services (WCF RIA Services Toolkit)</a>.</p>
<p>También podemos encontrar las siguientes páginas sobre el tema</p>
<ul>
<li><a href="http://code.msdn.microsoft.com/RiaServices" target="_blank">WCF RIA Services Code Gallery</a> </li>
<li><a href="http://msdn.microsoft.com/en-us/library/ee707344(v=VS.91).aspx" target="_blank">Documentación de MSDN sobre WCF RIA Services</a> </li>
</ul>
<h4>Continuará…</h4>
<p>Igual, si bien en este primero post no nos hemos adentrado (codificado) en la tecnología. No podemos dejar de lado la información contenida en este.</p>
<p>Para nuestro siguiente post si estaremos trabajando ya con código.</p>
<p>Saludos..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jorgelevy.com/2010/07/wcf-ria-services-v1-0-para-silverlight-4-introduccin-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Framework de Navegacion en Silverlight 3.- Parte 3</title>
		<link>http://www.jorgelevy.com/2009/08/framework-de-navegacion-en-silverlight-3-parte-3/</link>
		<comments>http://www.jorgelevy.com/2009/08/framework-de-navegacion-en-silverlight-3-parte-3/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 22:01:01 +0000</pubDate>
		<dc:creator>jorge.levy</dc:creator>
				<category><![CDATA[Framework de Navegación]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://www.jorgelevy.com/?p=26</guid>
		<description><![CDATA[Continuando con el Framework de Navegación en Silverlight 3, aqui la tercera entrega del tema. En esta ocasión veremos como cargar datos dinamicos (desde una clase de modelado de datos), y como leer datos desde el url string. Vínculos a los post anteriores relacionada con el tema: Si no has leido, o quieres recordar lo [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con el Framework de Navegación en Silverlight 3, aqui la tercera entrega del tema. En esta ocasión veremos como cargar datos dinamicos (desde una clase de modelado de datos), y como leer datos desde el url string.</p>
<p><span id="more-26"></span></p>
<h2>Vínculos a los post anteriores relacionada con el tema:</h2>
<p>Si no has leido, o quieres recordar lo que hemos visto hasta ahora, aquí los vinculos a los post anteriores:</p>
<p><a href="http://www.jorgelevy.com/?p=7">Framework de Navegacion en Silverlight 3.- Parte 1</a>     <br /><a href="http://www.jorgelevy.com/?p=22">Framework de Navegacion en Silverlight 3.- Parte 2</a></p>
<h2>Clases de modelado de datos</h2>
<p>Para esta parte, incluiremos una clase para hacer un modelado de datos (aunque estos datos pueden venir desde cualquier fuente de datos).</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/FrameworkDeNavegacion301.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="FrameworkDeNavegacion301" border="0" alt="FrameworkDeNavegacion301" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/FrameworkDeNavegacion301_thumb.png" width="244" height="237" /></a></p>
<p>Lo que nuestro código hace es crear un par de clases dentro de nuestro archivo Album.cs. La primera de ella en donde crearemos un Disco Músical (Album); con sus propiedades <em>ID</em>, <em>Nombre del Album</em> y el <em>Artista</em>. La segunda será una colección de Discos (Albums) que nos permitirá regresar un arreglo de 3 discos; así como los detalles de uno de ellos a partir de su ID.</p>
<pre class="brush: csharp;">using System.Collections.Generic;
using System.Linq;

namespace LLS.NavigationFramework.Part3.DataModel
{
    public class Album
    {
        public int ID { get; set; }
        public string AlbumName { get; set; }
        public string AlbumArtist { get; set; }
    }

    public class Albums
    {
        public List&lt;Album&gt; getAlbums()
        {
            List&lt;Album&gt; albums = new List&lt;Album&gt;();
            albums.Add(new Album() { ID = 1, AlbumName = &quot;Dónde estan los Ladrones&quot;, AlbumArtist = &quot;Shakira&quot; });
            albums.Add(new Album() { ID = 2, AlbumName = &quot;Galeria Caribe&quot;, AlbumArtist = &quot;Ricardo Arjona&quot; });
            albums.Add(new Album() { ID = 3, AlbumName = &quot;Tierna la Noche&quot;, AlbumArtist = &quot;Fey&quot; });
            return albums;
        }
        public Album getAlbumById(int id)
        {
            var album = from a in getAlbums()
                        where a.ID == id
                        select a;
            return album.First();
        }
    }
}</pre>
<h2>Preparando la solución para accesar las nuevas páginas de navegación</h2>
<p>Ademas necesitaremos agregar al menú de la aplicación el acceso a la nueva <strong>página</strong> de discos:</p>
<pre class="brush: xml;">&lt;StackPanel Margin=&quot;10&quot; VerticalAlignment=&quot;Top&quot; Grid.Column=&quot;0&quot;&gt;
    &lt;HyperlinkButton Content=&quot;Inicio&quot; FontSize=&quot;14&quot; Click=&quot;HyperlinkButton_Click&quot; Tag=&quot;Inicio&quot; /&gt;
    &lt;HyperlinkButton Content=&quot;Acerca&quot; FontSize=&quot;14&quot; Click=&quot;HyperlinkButton_Click&quot; Tag=&quot;Acerca&quot; /&gt;
    &lt;HyperlinkButton Content=&quot;Discos&quot; FontSize=&quot;14&quot; Click=&quot;HyperlinkButton_Click&quot; Tag=&quot;Discos&quot; /&gt;
&lt;/StackPanel&gt;
&lt;nav:Frame x:Name=&quot;MainFrame&quot; Grid.Column=&quot;1&quot; UriMapper=&quot;{staticResource uriMapper}&quot; Source=&quot;Inicio&quot; /&gt;</pre>
<p>Y agregaremos al <strong>mapeador de uris</strong> <strong>(UriMapper)</strong> el acceso a la nueva <strong>página (Page)</strong> de discos, así como un <strong>mapeo de uri (UriMapping)</strong> en donde configuraremos el uso de parametros dinámicos:</p>
<pre class="brush: xml;">&lt;navcore:UriMapper x:Key=&quot;uriMapper&quot;&gt;
    &lt;navcore:UriMapping Uri=&quot;Inicio&quot; MappedUri=&quot;/Content/Home.xaml&quot; /&gt;
    &lt;navcore:UriMapping Uri=&quot;Acerca&quot; MappedUri=&quot;/Content/About.xaml&quot; /&gt;
    &lt;navcore:UriMapping Uri=&quot;Discos&quot; MappedUri=&quot;/Content/Albums.xaml&quot; /&gt;
    &lt;navcore:UriMapping Uri=&quot;Disco/{id}&quot; MappedUri=&quot;/Content/Album.xaml?id={id}&quot; /&gt;
&lt;/navcore:UriMapper&gt;</pre>
<h2>Mostrando la lista de discos desde nuestra fuente de datos</h2>
<p>Para mostrar la lista de discos en nuestra fuente de datos, agregamos una <strong>página (page)</strong> (<em>página de silvelirght {silverlight page} del framework de navegación que veiamos en la </em><a href="http://www.jorgelevy.com/?p=22">parte 2</a><em></em><em> de la serie de post sobre este tema)</em> que llamaremos Albums.xaml.</p>
<p>En nuestra <strong>página (page)</strong> tendremos un Control de Elementos <em>(ItemsControl)</em>, en donde le definiremos su Plantilla <em>(ItemTemplate)</em>, que a su vez será una plantilla de datos <em>(DataTemplate)</em> de una lista de botones <em>(HyperlinkButton)</em> en donde el texto será el nombre del disco y tu tag será el ID del disco.</p>
<pre class="brush: xml;">&lt;StackPanel x:Name=&quot;LayoutRoot&quot;&gt;
    &lt;TextBlock FontSize=&quot;24&quot; Foreground=&quot;Chocolate&quot; Text=&quot;Colección de Discos&quot; /&gt;
    &lt;ItemsControl x:Name=&quot;AlbumList&quot;&gt;
        &lt;ItemsControl.ItemTemplate&gt;
            &lt;DataTemplate&gt;
                &lt;StackPanel Orientation=&quot;Horizontal&quot;&gt;
                    &lt;HyperlinkButton Content=&quot;{Binding AlbumName}&quot; Tag=&quot;{Binding ID}&quot; Click=&quot;HyperlinkButton_Click&quot; /&gt;
                &lt;/StackPanel&gt;
            &lt;/DataTemplate&gt;
        &lt;/ItemsControl.ItemTemplate&gt;
    &lt;/ItemsControl&gt;
&lt;/StackPanel&gt;</pre>
<p>Y en el código detras de este xaml, primero cargaremos los datos de la colección de discos en el loader de la clase; y en el evento del click de los botones lo que haremos es obtener el tag del boton para crear un url que apunte a la <strong>página (page)</strong> de detalles del disco usando el id del disco</p>
<p>Aqui es donde tenemos la parte medular de este post en donde haremos uso del <strong>Servicio de Navegación (NavigationService)</strong> que ofrece el Framework, el cual nos permite <strong>Navegar (Navigate)</strong> hacia una nueva página en nuestro <strong>Frame (Frame)</strong> donde tenemos contenidas nuestras <strong>Páginas (Page)</strong></p>
<pre class="brush: csharp;">public partial class Albums : Page
{
    public Albums()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(Albums_Loaded);
    }

    void Albums_Loaded(object sender, RoutedEventArgs e)
    {
        LLS.NavigationFramework.Part3.DataModel.Albums a = new LLS.NavigationFramework.Part3.DataModel.Albums();
        this.AlbumList.ItemsSource = a.getAlbums();
    }

    private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
    {
        HyperlinkButton btn = sender as HyperlinkButton;
        string id = btn.Tag.ToString();
        this.NavigationService.Navigate(new Uri(string.Format(&quot;Disco/{0}&quot;, id), UriKind.Relative));
    }
}</pre>
<h2>Mostrando los detalles de un disco</h2>
<p>Por último, agregaremos una <strong>página (page)</strong> que llamaremos Album, en donde mostraremos los detalles de un disco a partir de su identificador leido desde el url,</p>
<p>Aquí utilizaremos otro compomente importante en el framework de navegación, el <strong>Contexto de Navegación (NavigationContext)</strong>, que nos permitirá leer desde la <strong>cadena de consulta (QueryString)</strong>.</p>
<p>Recordemos que en nuestro <strong>Mapeos de Uri (UriMapper)</strong> hacemos llamadas del tipo /Content/Album.xaml?id={id} de donde podemos obtener el id del album a consultar.</p>
<p>Todo esto en el loader de la <strong>Página (Page)</strong>.</p>
<p>Nuestro xaml:</p>
<pre class="brush: xml;">&lt;StackPanel x:Name=&quot;LayoutRoot&quot;&gt;
    &lt;TextBlock FontSize=&quot;24&quot; Foreground=&quot;Chocolate&quot; Text=&quot;Detalles del Disco&quot; /&gt;
    &lt;StackPanel Orientation=&quot;Vertical&quot; x:Name=&quot;AlbumInfo&quot;&gt;
        &lt;TextBlock x:Name=&quot;AlbumName&quot; Text=&quot;{Binding AlbumName}&quot; /&gt;
        &lt;TextBlock x:Name=&quot;AlbumArtist&quot; Text=&quot;{Binding AlbumArtist}&quot; /&gt;
    &lt;/StackPanel&gt;
&lt;/StackPanel&gt;</pre>
<p>Y nuestro código:</p>
<pre class="brush: csharp;">public partial class Album : Page
{
    public Album()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(Album_Loaded);
    }
    void Album_Loaded(object sender, RoutedEventArgs e)
    {
        LLS.NavigationFramework.Part3.DataModel.Albums albums = new LLS.NavigationFramework.Part3.DataModel.Albums();
        LLS.NavigationFramework.Part3.DataModel.Album album = null;
        if (this.NavigationContext.QueryString[&quot;id&quot;] != null)
        {
            album = albums.getAlbumById(Convert.ToInt32(this.NavigationContext.QueryString[&quot;id&quot;]));
        }
        this.DataContext = album;
    }
}</pre>
<h2>Tiempo de ejecución</h2>
<p>En esta ocasión haremos notar los url del tipo:</p>
<h2>Donde encontrar este código:</h2>
<p><strike>KodiakLS.codeplex.com</strike> (I’m in love with codeplex.com)</p>
<h2>Proximamente:</h2>
<p>Ya que hemos entendido los&#160; conceptos básicos del Framework de Navegación de Silverlight 3 estamos listos para la última parte de nuestro tema:</p>
<ul>
<li>Plantilla de proyecto para el framework de navegación. </li>
</ul>
<p>Saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jorgelevy.com/2009/08/framework-de-navegacion-en-silverlight-3-parte-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Framework de Navegacion en Silverlight 3.- Parte 2</title>
		<link>http://www.jorgelevy.com/2009/07/framework-de-navegacion-en-silverlight-3-parte-2/</link>
		<comments>http://www.jorgelevy.com/2009/07/framework-de-navegacion-en-silverlight-3-parte-2/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 22:01:12 +0000</pubDate>
		<dc:creator>jorge.levy</dc:creator>
				<category><![CDATA[Framework de Navegación]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://www.jorgelevy.com/?p=22</guid>
		<description><![CDATA[** Post actualizado con la versión Silverlight 3 RTW ** Lo prometido es deuda, así que aquí la segunda parte del tema de Framework de Navegación en Silverlight 3. Si no has leido la primera parte, aquí la puedes encontrar. También mencionar que utilizaremos el proyecto/código que hicimos en dicho post. Configurando la ‘página’ de [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>** Post actualizado con la versión Silverlight 3 RTW **</em></strong></p>
<p>Lo prometido es deuda, así que aquí la segunda parte del tema de Framework de Navegación en Silverlight 3. Si no has leido la primera parte, <a href="http://www.jorgelevy.com/?p=7">aquí</a> la puedes encontrar. También mencionar que utilizaremos el proyecto/código que hicimos en dicho post.</p>
<p><span id="more-22"></span></p>
<h2>Configurando la ‘página’ de inicio de la aplicación</h2>
<p>Iniciaremos configurando la página de inicio de la aplicación, o mejor dicho del frame que la contiene, y para eso basta con completar la propiedad de ‘Source’ del ‘Frame’:</p>
<pre class="brush: xml;">&lt;nav:Frame x:Name=&quot;MainFrame&quot; Grid.Column=&quot;1&quot; Source=&quot;/Contents/Home.xaml&quot; UriMapper=&quot;{StaticResource uriMapper}&quot; /&gt;</pre>
<p>** SL3 RTW Update: Para la versión de Silverlight 3 RTW, es necesario agregar la propiedad UriMapper.</p>
<h2>Url Mapping</h2>
<p>Para no exponer nuestra estructura de archivos en el url, podemos utilizar lo que se llama Url Mappings, y esto puede ser a nivel de nuestro frame o a nivel de la aplicación. Para el proposito de esta guia, lo haremos a nivel de aplicación.</p>
<p>Lo primero es agregar a nuestro xaml de aplicación, usualmente App.xaml, el namespace: clr-namespace:System.Windows.<strong><em>Navigation</em></strong>;assembly=System.Windows.Controls.Navigation.</p>
<p>NOTA: A diferencia del namespace que agregamos a nuestro xaml principal (MainPage.xaml), notese que estamos usando System.Windows.<strong><em>Navigation</em></strong> en lugar de System.Windows.<strong><em>Controls</em></strong></p>
<p>Una vez que tenemos nuestro namespace agregaremos el elemento llamado UriMapper dentro de nuestros recursos (Application.Resources). Adicionalmente se deberá de configurar la propieda x:key del UriMapper.</p>
<p>Dentro del UriMapper definiremos nuestros mapeos utilizando el elemento UriMapping en donde tendremos un valor para la propiedad Uri, que es el nombre o la definición de nuestro nuevo uri, y la propiedad MappedUri, que a donde apuntará nuestro mapeo.</p>
<p>** SL3 RTW Update: Debio al uso de la propiedad de UriMapper en el frame de nuestra aplicación, es necesario asegurarnos que el valor que se tiene el MapperUri comienze con diagonal (‘\’)</p>
<pre class="brush: xml;">&lt;Application xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
            xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
            xmlns:navcore=&quot;clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation&quot;
            x:Class=&quot;Silverlight3.NavigationFramework.Part2.App&quot; &gt;
    &lt;Application.Resources&gt;
        &lt;navcore:UriMapper x:Key=&quot;uriMapper&quot;&gt;
            &lt;navcore:UriMapping Uri=&quot;Inicio&quot; MappedUri=&quot;/Contents/Home.xaml&quot; /&gt;
            &lt;navcore:UriMapping Uri=&quot;Acerca&quot; MappedUri=&quot;/Contents/About.xaml&quot; /&gt;
        &lt;/navcore:UriMapper&gt;
    &lt;/Application.Resources&gt;
&lt;/Application&gt;</pre>
<h2>Como usar los mapeos en la apliación</h2>
<p>Para usar los mapeos configurados solo basta con utilizar el valor de la propiedad Uri de los elementos UriMapping en el Tag de nuestros botones de navegación, incluso lo podemos configurar como el source de nuestro frame (para configurar la página inicial del frame).</p>
<pre class="brush: xml;">&lt;StackPanel Margin=&quot;8,8,8,8&quot; VerticalAlignment=&quot;Top&quot;&gt;
    &lt;HyperlinkButton Content=&quot;Inicio&quot; FontSize=&quot;14&quot; Click=&quot;NavigateButton_Click&quot; Tag=&quot;Inicio&quot; /&gt;
    &lt;HyperlinkButton Content=&quot;Acerca&quot; FontSize=&quot;14&quot; Click=&quot;NavigateButton_Click&quot; Tag=&quot;Acerca&quot; /&gt;
    &lt;HyperlinkButton Content=&quot;Clientes&quot; FontSize=&quot;14&quot; IsEnabled=&quot;False&quot;/&gt;
&lt;/StackPanel&gt;
&lt;nav:Frame x:Name=&quot;MainFrame&quot; Grid.Column=&quot;1&quot; Source=&quot;Inicio&quot; /&gt;</pre>
<h2>Actualizar iFrame en nuestro archivo aspx/html.</h2>
<p>** SL3 RTW Update: Para que los mapeos en la url funciones adecuadamente, es necesario verificar que el iFrame que es agregado al documento aspx/html tenga un id con valor = ‘_sl_historyFrame’</p>
<pre class="brush: xml;">&lt;iframe id=&quot;_sl_historyFrame&quot; style='visibility:hidden;height:0;width:0;border:0px'&gt;&lt;/iframe&gt;</pre>
<h2>Tiempo de Ejecución</h2>
<p>Nuestra gran diferencia con apenas estos cambios es que ahora nuestros url de acceso a nuestra aplicación serán del tipo:</p>
<p><strike>http://ligasilverlight.jorgelevy.com/Silverlight3.NavigationFramework.Part2TestPage.aspx#Inicio</strike></p>
<p>Notese que ahora estamos usando una palabra clave, en este caso ‘<strong><em>inicio’</em></strong>, y que ya no estamos mostrando ni donde esta ubicado nuestro xaml, ni siquiera que es un xaml al que estamos haciendo referencia.</p>
<h2>Donde encontrar este código:</h2>
<p><strike>KodiakLS.codeplex.com</strike> (I’m in love with codeplex.com)</p>
<h2>Proximamente:</h2>
<p>Aunque este post es corto y sencillo, nos está dando las bases para nuestros siguientes post, los cuales incluye:</p>
<ul>
<li>Como cargar información dependiendo de parametros en el url </li>
<li>Plantilla de projecto para el framework de navegación. </li>
<li>Etc… </li>
</ul>
<p>Saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jorgelevy.com/2009/07/framework-de-navegacion-en-silverlight-3-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Framework de Navegación en Silverlight 3</title>
		<link>http://www.jorgelevy.com/2009/06/framework-de-navegacin-en-silverlight-3/</link>
		<comments>http://www.jorgelevy.com/2009/06/framework-de-navegacin-en-silverlight-3/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 23:45:53 +0000</pubDate>
		<dc:creator>jorge.levy</dc:creator>
				<category><![CDATA[Framework de Navegación]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://www.jorgelevy.com/?p=7</guid>
		<description><![CDATA[** Post compatible con la versión Silverlight 3 RTW ** En los siguientes posts estaré platicando del nuevo Framework de Navegación introducido en la version 3 de Silverlight. La idea es ir platicando a detalle sobre las caracteristicas de framework, y poco a poco iremos creando una aplicación cada vez más robusta basada en este [...]]]></description>
			<content:encoded><![CDATA[<p><strong><em>** Post compatible con la versión Silverlight 3 RTW **</em></strong></p>
<p>En los siguientes posts estaré platicando del nuevo Framework de Navegación introducido en la version 3 de Silverlight. La idea es ir platicando a detalle sobre las caracteristicas de framework, y poco a poco iremos creando una aplicación cada vez más robusta basada en este concepto.</p>
<p><span id="more-7"></span></p>
<h2>Qué es el Framwork de Navegación en SL3?</h2>
<p>Es una de las caracteriticas introducidas en Silverlight 3 (todavia en beta) que nos permite inscrustar ‘frames’ dentro de nuestos xaml y permitir a las ‘paginas’ contenidad en estos frames conta con URL´s unicos, que a su vez sean amigables para los ‘motores de busquedas’.</p>
<p>Así pues, podemos hacer referencia a una sola parte de nuestra applicación web, llamadas <em>pages</em>, usando url´s del tipo: http://www.domino.com/page.html<em><strong>#home</strong></em>; en donde la parte a notar, dentro de este concepto, es <span style="text-decoration: underline">#home</span>, que le indica a la aplicación que información debe de mostrar (más adelante explicaremos con mayor detalle este punto)</p>
<h2>Configurar una aplicacion SL3 para usar el framework</h2>
<p>Para poder utilizar el framework de navegación en nuestros proyectos es necesario agregar la referencia System.Windows.Controls.Navigation a nuestro proyecto (incluida en las librerias de SL3).</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/FrameworkDeNavegacion101.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="FrameworkDeNavegacion101" border="0" alt="FrameworkDeNavegacion101" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/FrameworkDeNavegacion101_thumb.png" width="240" height="244" /></a></p>
<p>Y como ya es bien sabido, debemos agregar nuestra referencia en nuestro archivo xaml.</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/FrameworkDeNavegacion102.png" rel="lightbox"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="FrameworkDeNavegacion102" border="0" alt="FrameworkDeNavegacion102" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/FrameworkDeNavegacion102_thumb.png" width="644" height="111" /></a></p>
<h2>Codificando</h2>
<p>Una vez que hemos preparado nuestra solución para usar el framework de navegación podemos comenzar a codificar nuestra applicación. Lo primero que haremos es crear el menu de navegación con los tipicos menus de Inicio y Acerca, además agregaremos una opción de Clientes que nos servirán en los siguientes post (por ahora no le daremos funcionalidad a esta opción).</p>
<p>Una vez agregado el menú, comenzaremos a utilizar elementos del framework comenzando por poner un ‘frame’.</p>
<pre class="brush: xml;">&lt;Grid x:Name=&quot;LayoutRoot&quot;&gt;
    &lt;Grid.ColumnDefinitions&gt;
        &lt;ColumnDefinition Width=&quot;0.20*&quot;/&gt;
        &lt;ColumnDefinition Width=&quot;0.80*&quot;/&gt;
    &lt;/Grid.ColumnDefinitions&gt;
    &lt;StackPanel Margin=&quot;8,8,8,8&quot; VerticalAlignment=&quot;Top&quot;&gt;
        &lt;HyperlinkButton Content=&quot;Inicio&quot;/&gt;
        &lt;HyperlinkButton Content=&quot;Acerca&quot;/&gt;
        &lt;HyperlinkButton Content=&quot;Clientes&quot;/&gt;
    &lt;/StackPanel&gt;
    &lt;nav:Frame x:Name=&quot;MainFrame&quot; Grid.Column=&quot;1&quot; /&gt;
&lt;/Grid&gt;</pre>
<p>*Yo he decidido poner este par de bloques (menu y frame) en un Grid, pero cada quien podrá hacerlo como más le guste.</p>
<p>Ya que hemos definido nuestro espacio de trabajo principal, agregaremos un par de archivos xaml a nuestra solución en donde se definirá el contenido de cada una de la opciones del menu, los cuales son llamados ‘paginas (pages en ingles)’. La sugerencia es ponerlos en una carpeta especial para este tipo de archivos xaml. En este paso, utilizaremos una de los elementos contenido en las platillas para el compomente de control de navegación llamada ‘Silverlight Page’</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/FrameworkDeNavegacion103.png" rel="lightbox"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="FrameworkDeNavegacion103" border="0" alt="FrameworkDeNavegacion103" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/FrameworkDeNavegacion103_thumb.png" width="644" height="388" /></a></p>
<p>Y nuestra solución se vera así:</p>
<p><a href="http://www.jorgelevy.com/wp-content/uploads/2011/03/FrameworkDeNavegacion104.png" rel="lightbox"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="FrameworkDeNavegacion104" border="0" alt="FrameworkDeNavegacion104" src="http://www.jorgelevy.com/wp-content/uploads/2011/03/FrameworkDeNavegacion104_thumb.png" width="212" height="201" /></a></p>
<p>Principales caracteristicas que nuestros archivos xaml para nuestras ‘pages’:</p>
<ul>
<li>El tag principal del archivo debe de ser: navigation:Page </li>
<li>Dentro del tag principal, el contenido del atributo Title será el titulo que el navegador mostrará para la página. </li>
<li>Una vez mas, el tag principal tiene que hacer referencia a nuestro esamblado de Navegación. </li>
<li>El contenido de nuestro xaml será lo que se muestre en nuestro frame de nuestro xaml principal. </li>
</ul>
<pre class="brush: xml;">&lt;navigation:Page x:Class=&quot;Silverlight3.NavigationFramework.Contents.Inicio&quot;
                xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
                xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
                xmlns:navigation=&quot;clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation&quot;
                Title=&quot;SL3 Framework de Navegación.- Página principal&quot;&gt;
    &lt;Grid x:Name=&quot;LayoutRoot&quot; Background=&quot;White&quot;&gt;
        &lt;TextBlock Text=&quot;Página principal&quot; FontSize=&quot;24&quot; /&gt;
    &lt;/Grid&gt;
&lt;/navigation:Page&gt;</pre>
<p>Ahora bien, una vez que tenemos todos nuestros elementos listo, podemos pasar a la parte programativa, que será la encargada de hacer funcionar el framework y el paso entre páginas.</p>
<p>Hasta aquí, es decir para este ejemplo, la forma en que navegaremos es cargando las páginas de contenido en nuestro frame de nuestra xaml principal usando los eventos de click de nuestros HiperlinkButtons de nuestro menú. Los tres eventos apuntaran hacia la misma función evitando así reescribir código inecesariamente. Ademas agregaremos un atributo de ‘Tag’ a cada uno de las opciones de menú para diferenciar hacia que ‘pagina’ apuntará nuestra applicación.</p>
<pre class="brush: xml;">&lt;HyperlinkButton Content=&quot;Inicio&quot; Click=&quot;NavigateButton_Click&quot; Tag=&quot;/Contents/Home.xaml&quot; /&gt;
&lt;HyperlinkButton Content=&quot;Acerca&quot; Click=&quot;NavigateButton_Click&quot; Tag=&quot;/Contents/About.xaml&quot; /&gt;</pre>
<p>Y en nuestra función a la que apunta nuestro even handler, en este caso NavigateButton_Click, definiremos un HyperlinkButton para leer nuestro sender, así como un string para definir el url del contenido. Y la parte que corresponde al framework de navegación que es apuntar la propiedad de ‘Navigate’ de nuestro frame hacia la nueva url.</p>
<pre class="brush: csharp;">private void NavigateButton_Click(object sender, RoutedEventArgs e)
{
    HyperlinkButton btn = sender as HyperlinkButton;
    string url = btn.Tag.ToString(); 

    this.MainFrame.Navigate(new Uri(url, UriKind.Relative));
}</pre>
<p>Y listo, tenemos nuestra primera aplicación que utiliza el framework de navegación.</p>
<h2>Tiempo de ejecución</h2>
<p>La forma de acceder a una aplicación con framework de navegación es como la usual, hacemos la llamada a nuestra página web donde esta montado el xap:</p>
<p><strike>http://ligasilverlight.jorgelevy.com/Silverlight3.NavigationFramework.Part1TestPage.html</strike></p>
<p>Pero si queremos ingresar directamente a una ‘página’ de nuestra aplicación, podemos utilizar url del tipo:</p>
<p><strike>http://ligasilverlight.jorgelevy.com/Silverlight3.NavigationFramework.Part1TestPage.html#/Contents/About.xaml</strike>&#160;</p>
<h2>Donde encontrar este código:</h2>
<p><strike>KodiakLS.codeplex.com</strike> (I’m in love with codeplex.com)</p>
<h2>Proximamente:</h2>
<ul>
<li>Como modificar el url para uso de nombres mas amigables </li>
<li>Como cargar información dependiendo de parametros en el url </li>
<li>Plantilla de projecto para el framework de navegación. </li>
<li>Etc… </li>
</ul>
<p>Es decir, el tema da para mucho…</p>
<p>Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jorgelevy.com/2009/06/framework-de-navegacin-en-silverlight-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

