<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">El blog de Andres Perez en Geeks.ms</title><subtitle type="html" /><id>http://geeks.ms/blogs/aperez/atom.aspx</id><link rel="alternate" type="text/html" href="http://geeks.ms/blogs/aperez/default.aspx" /><link rel="self" type="application/atom+xml" href="http://geeks.ms/blogs/aperez/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.31106.3070">Community Server</generator><updated>2011-04-03T03:25:02Z</updated><entry><title>[W8] Scroll infinito ( II )</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2012/11/07/w8-scroll-infinito-ii.aspx" /><id>/blogs/aperez/archive/2012/11/07/w8-scroll-infinito-ii.aspx</id><published>2012-11-07T21:48:41Z</published><updated>2012-11-07T21:48:41Z</updated><content type="html">&lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Continúo la serie de scroll infinito. En la implementación del artículo anterior, usaba un LoadItemsResult para devolver la carga asíncrona de la fuente de datos. Sin embargo, hay ocasiones en que esto se nos queda corto, como por ejemplo cuando ocurre una excepción en la carga o queremos limitar los elementos que se van cargando. Es por ello que crearemos un nuevo tipo que implemente &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/br206598.aspx"&gt;IAsyncOperation&lt;/a&gt;&amp;lt;LoadMoreItemsResult&amp;gt; que nos permita tener más control sobre lo que devolvemos. Esta interfaz dispone de un método y una propiedad:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;GetResults: Devuelve el resultado de la operación&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Completed: Una propiedad de tipo IAsyncOperationHandler.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;La idea es sencilla. Anteriormente teníamos un método que se encargaba de obtener los datos. Ahora nosotros vamos a hacer ese método a través de esa interfaz, permitiendo el control absoluto de lo que queremos devolver. Tendremos un método asíncrono que es el encargado de obtener los datos y añadirlos al IncrementalSource (que recordemos, es una ObservableCollection) tal que así:&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cbea6c76-0942-44cc-b681-487d226fa965" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; async &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; LoadItems(IncrementalSource&amp;lt;T&amp;gt; source, &lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt; count)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            {&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; result = await SourceManager.Load(count);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; result)&lt;/li&gt; &lt;li&gt;                {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    source.Add(item);&lt;/li&gt; &lt;li&gt;                }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;                results.Count = count;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                asyncStatus = AsyncStatus.Completed;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (Completed != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Completed(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;, asyncStatus);&lt;/li&gt; &lt;li&gt;            }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Exception&lt;/span&gt; ex)&lt;/li&gt; &lt;li&gt;            {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                &lt;span style="color:#008000;"&gt;// Gesti?n de excepciones&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;Básicamente lo que hacemos es cargar los datos y cuando ya lo están:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Notificar cuántos elementos se han cargado.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Lanzar el evento Completed para notificar que la carga se ha completado. Le el objeto actual como sender y un parámetro de AsyncStatus que lo asignamos como Completed, lo cual notifica al subscriptor del evento que la parte asíncrona ya ha terminado. El resto de la clase sería así:&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;div align="justify"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:69861cd3-7d54-471e-8c42-33bf9ee161c1" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DataAsyncLoader&lt;/span&gt;&amp;lt;T&amp;gt; : IAsyncOperation&amp;lt;LoadMoreItemsResult&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; AsyncStatus asyncStatus = AsyncStatus.Started;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; LoadMoreItemsResult results;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DataAsyncLoader(IncrementalSource&amp;lt;T&amp;gt; source, &lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt; count)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            LoadItems(source, count);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; AsyncOperationCompletedHandler&amp;lt;LoadMoreItemsResult&amp;gt; Completed { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; LoadMoreItemsResult GetResults()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; results;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; AsyncStatus Status&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.asyncStatus; }&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;Y por último y recordando el &lt;a href="http://geeks.ms/blogs/aperez/archive/2012/11/05/w8-scroll-infiinito-i.aspx"&gt;artículo anterior&lt;/a&gt;, en el método dentro de IncrementalSource que teníamos la carga de elementos debemos cambiarlo por:&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:399049de-8d71-49a6-af97-4a20c060d2b4" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IAsyncOperation&amp;lt;LoadMoreItemsResult&amp;gt; LoadMoreItemsAsync(&lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt; count)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DataAsyncLoader&amp;lt;T&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;, count);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Y ya está. Con esto estamos externalizando la carga de elementos y teniendo un control absoluto de lo que ocurre antes, durante y después de la carga.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207354" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author></entry><entry><title>[W8] Scroll infiinito ( I )</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2012/11/05/w8-scroll-infiinito-i.aspx" /><id>/blogs/aperez/archive/2012/11/05/w8-scroll-infiinito-i.aspx</id><published>2012-11-05T20:11:08Z</published><updated>2012-11-05T20:11:08Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Una de las mayores bazas de una interfaz de usuario es cómo se muestran los elementos y cómo se van cargando. En el caso de Windows 8 (y Windows Phone) disponer de elementos en un ListView es algo común. Pero cuando llegamos al final de la lista, podemos adoptar dos alternativas:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Colocar un botón tipo “Cargar más elementos”&lt;/li&gt;    &lt;li&gt;O hacer que automáticamente cargue los elementos según lo necesite. Evidentemente, este es el caso que vamos a comentar.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;En primer lugar tenemos un ListView con un ItemSource asociado a un ObservableCollection&amp;lt;T&amp;gt;. Para detectar si hay más elementos, el ListView dispone de una propiedad llamada &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.listviewbase.incrementalloadingtrigger.aspx"&gt;IncrementalLoadingTrigger&lt;/a&gt;. Esta propiedad por defecto está ajustada a Edge. Si queremos que no haya ningún tipo de carga incremental, hay que ajustarla a None.&lt;/p&gt;  &lt;p&gt;En segundo lugar, tenemos que lograr que los datos nos indiquen cuándo es necesario obtener más elementos. Como hasta ahora usamos un ObservableCollection&amp;lt;T&amp;gt; como binding, necesitamos cambiarlo un poco. En este punto se introduce la interfaz &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.data.isupportincrementalloading.aspx"&gt;ISupportIncrementalLoading&lt;/a&gt;, que se encargará de notificar al destino del binding si hay más elementos disponibles para cargar y un método para cargar los datos en función de la cantidad de elementos previamente cargados:&lt;/p&gt;  &lt;p&gt;HasMoreItems: Indica si hay más elementos para cargar.&lt;/p&gt;  &lt;p&gt;LoadMoreItemsAsync: Carga asíncrona de los nuevos elementos.&lt;/p&gt;  &lt;p&gt;Partiendo de lo anterior, necesitamos crear un nuevo tipo que implemente la interfaz ISupportIncrementalLoading y la ObservableCollection&amp;lt;T&amp;gt; para poder bindear los datos. Veamos un ejemplo que yo he llamado IncrementalSource:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:60bd5cd7-b490-477f-b7fa-05fd62edd9e6" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IncrementalSource&lt;/span&gt;&amp;lt;T&amp;gt; : ObservableCollection&amp;lt;T&amp;gt;, ISupportIncrementalLoading&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; VirtualCount { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IncrementalSource()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;#region&lt;/span&gt; ISupportIncrementalLoading&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; HasMoreItems&lt;/li&gt; &lt;li&gt;            {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.VirtualCount &amp;gt; 0; }&lt;/li&gt; &lt;li&gt;            }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IAsyncOperation&amp;lt;LoadMoreItemsResult&amp;gt; LoadMoreItemsAsync(&lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt; count)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            }&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;#endregion&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;   &lt;p&gt;Sólo tenemos que rellenar el método de LoadMoreItemAsync., que devuelve un IAsyncOperation de &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.data.loadmoreitemsresult.aspx"&gt;LoadMoreResultItems&lt;/a&gt;. Esta estructura tiene un único campo Count que indica la cantidad de elementos que han sido cargados. De este modo se va notificando al destino del binding qué elementos se van cargando de forma asíncrona para que los vaya obteniendo y renderizando. Voy a adjuntar un ejemplo teórico de cómo se podría rellenar ese método:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9a3292e7-ecce-4bf7-9bd0-4b6fb3ec17b2" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IAsyncOperation&amp;lt;LoadMoreItemsResult&amp;gt; LoadMoreItemsAsync(&lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt; count)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Task&lt;/span&gt;.Run&amp;lt;LoadMoreItemsResult&amp;gt;(&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                async () =&amp;gt;&lt;/li&gt; &lt;li&gt;                {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; result = await SourceManager.Load(count);&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; items &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; result)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    {&lt;/li&gt; &lt;li&gt;                        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Add(result);     &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    }&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; LoadMoreItemsResult() { Count = (&lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt;)result.Count };&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                }).AsAsyncOperation&amp;lt;LoadMoreItemsResult&amp;gt;();&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;   &lt;p&gt;Y si el ListView está dentro de un ScrollViewer, ya tendremos el scroll infinito funcionando.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207329" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author><category term="c#" scheme="http://geeks.ms/blogs/aperez/archive/tags/c_2300_/default.aspx" /><category term="wpf" scheme="http://geeks.ms/blogs/aperez/archive/tags/wpf/default.aspx" /><category term="winrt" scheme="http://geeks.ms/blogs/aperez/archive/tags/winrt/default.aspx" /><category term="windows8" scheme="http://geeks.ms/blogs/aperez/archive/tags/windows8/default.aspx" /></entry><entry><title>[WCF] Metadatos en un WCF habilitado para AJAX</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2012/06/10/wcf-metadatos-en-un-wcf-habilitado-para-ajax.aspx" /><id>/blogs/aperez/archive/2012/06/10/wcf-metadatos-en-un-wcf-habilitado-para-ajax.aspx</id><published>2012-06-10T13:10:09Z</published><updated>2012-06-10T13:10:09Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Si queremos añadir&amp;#160; un servicio WCF habilitado para AJAX, podemos hacerlo desde Añadir un nuevo item y seleccionar el elemento correspondiente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_1B2B469A.png"&gt;&lt;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="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_thumb_5F00_57276282.png" width="431" height="299" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Esto añade el servicio a nuestro proyecto. Sin embargo, cuando lo arrancamos podemos ver un mensaje que indica que la publicación de metadatos está desactivada para ese servicio. La página del servicio nos sugiere que añadamos lo siguiente a nuestro fichero de configuración, que en efecto sirve para habilitar los metadatos sin mayor problema:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&amp;lt;behaviors&amp;gt;
    &amp;lt;serviceBehaviors&amp;gt;
        &amp;lt;behavior name=&lt;span class="str"&gt;&amp;quot;MyServiceTypeBehaviors&amp;quot;&lt;/span&gt; &amp;gt;
            &amp;lt;serviceMetadata httpGetEnabled=&lt;span class="str"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; /&amp;gt;
        &amp;lt;/behavior&amp;gt;
    &amp;lt;/serviceBehaviors&amp;gt;
&amp;lt;/behaviors&amp;gt;&lt;/pre&gt;

&lt;p&gt;Lo añadimos pero sigue sin habilitarse los metadatos Incluso muestra un mensaje de error indicando que el fichero de configuración es incorrecto. Si observamos el fichero de configuración (normalmente web/app.config) veremos que faltan algunos datos por configurar. Aquí voy a mostrar cómo debe quedar el .config para que la publicación de metadatos sea efectiva.&lt;/p&gt;

&lt;p&gt;El error que nos muestra indica que la definición del servicio no incluye la dirección del endpoint. Por ello:&lt;/p&gt;

&lt;p&gt;1 – Lo primero que hacemos es añadir el behaviour de nuestro servicio en la sección que indiqué anteriormente y añadirle la etiqueta para que reconozca los metadatos y habilitarla.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &amp;lt;behaviors&amp;gt;
      &amp;lt;serviceBehaviors&amp;gt;
        &amp;lt;behavior name=&lt;span class="str"&gt;&amp;quot;TestWCFAjax.Service1AspNetAjaxBehavior&amp;quot;&lt;/span&gt;&amp;gt;
          &amp;lt;serviceMetadata httpGetEnabled=&lt;span class="str"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; /&amp;gt;
        &amp;lt;/behavior&amp;gt;
      &amp;lt;/serviceBehaviors&amp;gt;
    &amp;lt;/behaviors&amp;gt;&lt;/pre&gt;


&lt;p&gt;2 – Fijémonos en la definición del servicio que ha creado por defecto:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&amp;lt;service name=&lt;span class="str"&gt;&amp;quot;TestWCFAjax.Service1&amp;quot;&lt;/span&gt;&amp;gt;
        &amp;lt;endpoint address=&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt; behaviorConfiguration=&lt;span class="str"&gt;&amp;quot;TestWCFAjax.Service1AspNetAjaxBehavior&amp;quot;&lt;/span&gt;
          binding=&lt;span class="str"&gt;&amp;quot;webHttpBinding&amp;quot;&lt;/span&gt; contract=&lt;span class="str"&gt;&amp;quot;TestWCFAjax.Service1&amp;quot;&lt;/span&gt; /&amp;gt;
      &amp;lt;/service&amp;gt;&lt;/pre&gt;

&lt;p&gt;Lógicamente no encuentra un endpoint similar y ahí se produce el error. Pero, ¿dónde está? Fijémonos que anteriormente teníamos definido un behaviour y dentro un endpoint que hacía referencia a nuestro servicio. Ahora al cambiar esto, es nuestro servicio como tal quien tiene un behavior asociado y no su endpoint:&lt;/p&gt;

&lt;pre class="csharpcode"&gt; &amp;lt;service name=&lt;span class="str"&gt;&amp;quot;TestWCFAjax.Service1&amp;quot;&lt;/span&gt; behaviorConfiguration=&lt;span class="str"&gt;&amp;quot;TestWCFAjax.Service1AspNetAjaxBehavior&amp;quot;&lt;/span&gt;&amp;gt;
        &amp;lt;endpoint address=&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt; binding=&lt;span class="str"&gt;&amp;quot;webHttpBinding&amp;quot;&lt;/span&gt; contract=&lt;span class="str"&gt;&amp;quot;TestWCFAjax.Service1&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;


&lt;p&gt;Con esto nuestro servicio ya arrancará con los metadatos habilitados.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205561" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author><category term="wcf" scheme="http://geeks.ms/blogs/aperez/archive/tags/wcf/default.aspx" /><category term="asp" scheme="http://geeks.ms/blogs/aperez/archive/tags/asp/default.aspx" /></entry><entry><title>[C#] Parallel.For</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2012/04/15/c-parallel-for.aspx" /><id>/blogs/aperez/archive/2012/04/15/c-parallel-for.aspx</id><published>2012-04-15T18:45:10Z</published><updated>2012-04-15T18:45:10Z</updated><content type="html">&lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Considero que desarrollar algo, por simple que sea, requiere el máximo cuidado y esmero. Sin embargo si estamos hablando de incluir las prácticas de paralelización, debemos ser mucho más cuidadosos y conocer mejor el problema que tratamos resolver. Resolver algo de forma paralela no es trivial en ningún caso. &lt;/p&gt;  &lt;p align="justify"&gt;No obstante, .NET nos ofrece una serie de &lt;em&gt;ayudas&lt;/em&gt; a través del framework para paralelizar nuestro código. Vamos a empezar viendo un bucle y un código muy simple:&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:419px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:548c3a6a-1e3c-4847-b459-d732006b8b3a" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; itemList.Count(); i++)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            {&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#008000;"&gt;//Console.WriteLine(i);&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                itemList[i] += (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)&lt;span style="color:#2b91af;"&gt;Math&lt;/span&gt;.Cos(i);&lt;/li&gt; &lt;li&gt;            }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;Tenemos un array de N elementos y a cada uno de ellos vamos a sumarle el coseno i-ésimo. Para paralelizar esto, tenemos que tener en cuenta el coste de la paralelización. Ese coste está derivado del esfuerzo que hay que hacer para lanzar y mantener los hilos o las tareas. Si este coste es demasiado alto (por ejemplo para bucles u operaciones muy pequeñas) compensa más usar siempre la versión secuencial. Vamos a ver cómo podemos paralelizar esto, empleando Parallel.For.&lt;/p&gt;  &lt;p align="justify"&gt;Parallel.For (y Parallel.ForEach) están incluidos dentro de Parallel-LINQ (PLINQ) por lo que no tenemos que instalar nada extra para poder usarlos. La sintaxis en este caso es sencilla:&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:523px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3f296d45-6778-4c8e-84bd-facb5e38e12a" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; parallelResult = &lt;span style="color:#2b91af;"&gt;Parallel&lt;/span&gt;.For(0, itemList.Count(), (i) =&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            {&lt;/li&gt; &lt;li&gt;                itemList[i] += (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)&lt;span style="color:#2b91af;"&gt;Math&lt;/span&gt;.Cos(i);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            });&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;Pese a que actualmente dispone de 12 sobrecargas, muestro por ahora la más sencilla:&lt;/p&gt;  &lt;p align="justify"&gt;- Primero indicamos el índice de origen para la primera iteración del bucle.&lt;/p&gt;  &lt;p align="justify"&gt;- Después hasta dónde queremos llegar, de forma exclusiva. &lt;/p&gt;  &lt;p align="justify"&gt;- Por último, definimos un Action. El action es lo que se ejecutará.&lt;/p&gt;  &lt;p align="justify"&gt;Traduciendo, lo que queremos hacer es un bucle paralelo que vaya de 0 a itemList.Count() y que ejecute el coseno ié-simo de cada elemento. Fíjese como no tenemos dependencias ni variables compartidas. Más tarde veremos este punto. Nótese además como Parallel.For devuelve una variable de tipo ParallelLoopResult, que nos indica cuándo el bucle ha terminado de ejecutarse y cuando se ha roto la iteración antes de romper el bucle. Para obtener la medición de los tiempos que se muestran a continuación he usado un sencillo StopWatch y para medir la parte paralela, he usado el IsCompleted del ParallelLoopResult que me ha permitido &lt;em&gt;esperar&lt;/em&gt; la ejecución paralela y poder cuantificar el tiempo trascurrido.&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:395px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:141b3517-e335-441e-b712-ab3219272427" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (parallelResult.IsCompleted == &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;) ;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;Por ahora comparemos resultados. Para ello simplemente he ejecutado el código anterior con distintos tamaños de lista, desde 1 elementos hasta 10.000.000. Para obtener mediciones un poco más precisas he ejecutado cada sección 4 veces y he hecho la media de los resultados, puesto que en algunos casos el resultado de las operaciones puede ser trivial debido a su bajo coste:&lt;/p&gt; &lt;/td&gt;&lt;/tr&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_2DA3869C.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_thumb_5F00_4C0DC785.png" width="244" height="205" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Y aquí tenemos la representación gráfica de los resultados, donde se puede apreciar mejor la diferencia de valores:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_5C398F7E.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_thumb_5F00_48AC2FDD.png" width="461" height="345" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Podemos apreciar como en valores de un bucle con pocos elementos, el coste de paralelo normalmente es superior al de secuencial. Esto es debido al coste necesario para el mantenimiento de las task que forman la ejecución de la parte paralela. Pero a su vez notamos que en el momento en que el orden de los elementos va creciendo, el coste de la parte secuencial se vuelve exponencial mientras que la parte paralela, pese a que crece, dispone de un coste cercano al lineal.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204470" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author><category term="c#" scheme="http://geeks.ms/blogs/aperez/archive/tags/c_2300_/default.aspx" /><category term="plinq" scheme="http://geeks.ms/blogs/aperez/archive/tags/plinq/default.aspx" /><category term="parallel" scheme="http://geeks.ms/blogs/aperez/archive/tags/parallel/default.aspx" /></entry><entry><title>[WCF] XMLSerializer VS DataContractSerializer</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2012/02/18/xmlserializer-vs-datacontractserializer.aspx" /><id>/blogs/aperez/archive/2012/02/18/xmlserializer-vs-datacontractserializer.aspx</id><published>2012-02-18T15:26:32Z</published><updated>2012-02-18T15:26:32Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Este artículo nace de una curiosidad que me pasó el otro día al trabajar con un DataContractSerializer. Para empezar, tengamos como ejemplo la siguiente clase:&lt;/p&gt;    &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a3e063c1-94a1-46e0-ae8e-3cfe2d5e8949" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ExampleClass&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; A;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; B;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; C;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;Serializar algo así, no es complicado. Como son tipos básicos, ni siquiera tenemos que añadir atributos a las propiedades. Así pues, escribiendo este código XML permitirá instanciar una clase de tipo&amp;#160; ExampleClass empleando un XMLSerializer:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7c101be4-5b80-4f4d-862f-65d62131ff81" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ExampleClass&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;C&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;3&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;C&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;A&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;A&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;B&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;2&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;B&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ExampleClass&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5d252591-d938-49d4-ba33-fe90015dc8b4" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;{ConsoleApplication.ExampleClass}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    A: 1&lt;/li&gt; &lt;li&gt;    B: 2&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    C: 3&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;   &lt;p&gt;Usando el XMLSerializer, comprobaremos que se instancia una clase ExampleClass donde el valor de C es 3, el de A es 1 y el de B es 2. ¿Sencillo, no? Bueno, pues ahora vamos a hacer lo mismo pero con un DataContractSerializer. Lo único que tenemos que hacer es modificar el XML para añadirle los atributos de forma que sean compatibles con el esquema de DataContract. Una vez hecho esto, simplemente lo deserializamos y esto es lo que ocurre:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:23ec5a03-e7c6-4bf9-b625-175c55a902e8" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;{ConsoleApplication.ExampleClass}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    A: 0&lt;/li&gt; &lt;li&gt;    B: 0&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    C: 3&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Podemos ver que sólo ha serializado el valor de la propiedad C, que es la primera que aparece en el XML y del resto ha pasado de largo. Esto ha ocurrido porque el serializador coge la primera propiedad y busca las siguientes a partir de la primera, en estricto orden alfabético. Es decir, si en el XML lo cambiamos del siguiente modo, veremos como efectivamente asigna la B y la C, pero no la A:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b70053e6-bc58-414e-bec3-4108b2eee5ad" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ExampleClass&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;http://schemas.datacontract.org/2004/07/ConsoleApplication&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;xmlns:i&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;B&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;2&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;B&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;C&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;3&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;C&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;A&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;A&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ExampleClass&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Y esta es la salida que obtenemos:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:57a12398-28e4-4318-acd1-0b403a0ea5f7" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;{ConsoleApplication.ExampleClass}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    A: 0&lt;/li&gt; &lt;li&gt;    B: 2&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    C: 3&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Bien, podemos hacer una cosa. Para evitar tener problemas al deserializar, podemos primero instanciar una clase del tipo que queramos trabajar y serializarla. Luego ya podemos trastear con el XML y asignarle los valores necesarios sin ningún tipo de problemas. Pero claro, eso no soluciona nuestro problema. Si lo que quiero es crear XML rápidos de prototipados y a mano (sí, soy un temerario, ¿y qué? &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Sonrisa" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/wlEmoticon_2D00_smile_5F00_45277A58.png" /&gt;) , con una gran cantidad de campos es muy fácil que me confunda y que alguno no se cargue. O muchos de ellos. Y sí, esto es una limitación del DataContractSerializer. Los campos deben estar ordenados alfabéticamente. ¿Hay algún modo de paliarlo? Vamos a verlo.&lt;/p&gt;  &lt;p&gt;La primera opción la tenemos en el parámetro Order del atributo DataMember. De este modo, podemos indicarle a la propiedad en qué lugar aparece el elemento en el fichero XML. Es la opción recomendable cuando por algún motivo, no se sigue el orden por defecto (alfabético) para serializar.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d7517422-e0bb-46bc-bfc6-d52f843619a1" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;DataMember&lt;/span&gt;(Order = 2)]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; C;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Otra opción es usar el XMLSerializer de toda la vida. No hay forma, por lo menos por ahora, que un DataContractSerializer asigne los elementos a las propiedades sin un orden establecido. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=203448" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author><category term="c#" scheme="http://geeks.ms/blogs/aperez/archive/tags/c_2300_/default.aspx" /><category term="wcf" scheme="http://geeks.ms/blogs/aperez/archive/tags/wcf/default.aspx" /></entry><entry><title>[Evento] Clausura del Curso de Desarrollo de dispositivos móviles con .NET</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2011/07/31/evento-clausura-del-curso-de-desarrollo-de-dispositivos-m-243-viles-con-net.aspx" /><id>/blogs/aperez/archive/2011/07/31/evento-clausura-del-curso-de-desarrollo-de-dispositivos-m-243-viles-con-net.aspx</id><published>2011-07-31T13:53:55Z</published><updated>2011-07-31T13:53:55Z</updated><content type="html">&lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Desde el pasado lunes 25 al jueves 28 de julio impartí, con &lt;a href="http://blog.r2d2rigo.es"&gt;Rodrigo Díaz&lt;/a&gt; el curso de desarrollo de aplicaciones móviles con .NET. El temario consistió en lo siguiente:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Windows Phone.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Introducción a C# 4.0&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Aplicaciones para Windows Phone, con MVVM, Databinding e IsolatedStorage&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Juegos con XNA para Windows Phone.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Cómo publicar tus aplicaciones/juegos en el Marketplace.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Así pues, antes de nada me gustaría dar las gracias a todas las personas que han asistido al curso, a La Seu de la Nucía por permitirnos usar sus instalaciones y a todas las personas que de un modo u otro han logrado que este curso haya podido realizarse.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/WP_5F00_000151_5F00_2D718A28.jpg"&gt;&lt;img style="display:block;float:none;margin-left:auto;margin-right:auto;" title="WP_000151" alt="WP_000151" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/WP_5F00_000151_5F00_thumb_5F00_10A7EF46.jpg" width="374" height="280" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Además, dentro de unos días (en cuanto disponga un rato) publicaré en el blog los apuntes para los alumnos.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=198591" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author></entry><entry><title>Usando Reflection para tener una única ventana modal personalizable.</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2011/06/24/usando-reflection-para-tener-una-250-nica-ventana-modal-personalizable.aspx" /><id>/blogs/aperez/archive/2011/06/24/usando-reflection-para-tener-una-250-nica-ventana-modal-personalizable.aspx</id><published>2011-06-23T22:01:10Z</published><updated>2011-06-23T22:01:10Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Tenemos el siguiente escenario: Una aplicación (en este caso en WPF) que tiene varias ventanas modales. Cada ventana contendrá un UserControl único, que a su vez se construirá mediante una serie de parámetros determinados dependientes de lo que requiera el propio control.&lt;/p&gt;  &lt;p align="justify"&gt;El primer enfoque, que lo podemos&amp;#160; llamar a fuerza bruta, sería crear una ventana por cada control de usuario que tenga. El segundo enfoque, algo más fino, sería crear el UserControl antes de la ventana y ajustarlo mediante una propiedad para que lo cargue en el contenedor que le digamos a la ventana. No es lo más elegante, pero estamos instanciando el UserControl en casos particulares y no es algo muy genérico.&lt;/p&gt;  &lt;p align="justify"&gt;El tercer enfoque, que es el que propongo aquí, sería usar Reflection para que la propia ventana sea quien instancie el UserControl y nosotros sólo nos ocupemos de crear la ventana con los parámetros adecuados. Así no tenemos que estar pendiente de la creación del control en sí, sino simplemente de crear la ventana, decirle qué queremos mostrar y mostrarla al usuario. &lt;/p&gt;  &lt;p align="justify"&gt;Para ello, en primer lugar creamos una ventana en WPF. Luego, en el constructor insertaremos los siguientes parámetros:&lt;/p&gt;  &lt;p align="justify"&gt;- Primero, el tipo del control que se instanciará.&lt;/p&gt;  &lt;p align="justify"&gt;- Y después, un listado de parámetros:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2dac4d06-38f0-409f-826c-7380e5417fdf" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;1:  public ModalPropertyWindow(Type childrenType, params object[] logicObject)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt; 2:          {&lt;/li&gt; &lt;li&gt; 3:              InitializeComponent();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt; 4:          }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;     &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Luego, lo que tenemos que hacer es instanciar el control que queremos con los parámetros que se requieran. Usaremos Activator.CreateInstance, que creará esa instancia con una serie de parámetros. Internamente recorre esa clase y busca un constructor que tenga la disposición de parámetros que le indicamos. Si no lo encuentra, evidentemente producirá una excepción:&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1ab7cdd5-0932-44a3-80a4-ef0626a9d217" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;this.stackPanel2.Children.Add(Activator.CreateInstance(childrenType, logicObject) as UIElement);&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;   &lt;p align="justify"&gt;Nótese que directamente añadimos la instancia creada a un StackPanel.&lt;/p&gt;  &lt;p align="justify"&gt;Por último, sólo tenemos que llamar a la ventana e instanciarla con el control que queramos:&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:efdfe79d-1b73-4468-b071-d96e9497b79b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;ModalPropertyWindow window = new ModalPropertyWindow(typeof(ClientControl), this.currentCliente, this.loggedUser);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;window.ShowDialog();&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;   &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Y así para todas las ventanas que queramos. En resumen: una única ventana modal, todos los controles que queramos y no nos tenemos que preocupar de instanciar cada uno de forma particular.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=196547" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author><category term="c#" scheme="http://geeks.ms/blogs/aperez/archive/tags/c_2300_/default.aspx" /><category term="silverlight" scheme="http://geeks.ms/blogs/aperez/archive/tags/silverlight/default.aspx" /><category term="wpf" scheme="http://geeks.ms/blogs/aperez/archive/tags/wpf/default.aspx" /></entry><entry><title>[EVENTO] Desarrollo de videojuegos para Windows Phone 7</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2011/06/03/evento-desarrollo-de-videojuegos-para-windows-phone-7.aspx" /><id>/blogs/aperez/archive/2011/06/03/evento-desarrollo-de-videojuegos-para-windows-phone-7.aspx</id><published>2011-06-03T00:02:00Z</published><updated>2011-06-03T00:02:00Z</updated><content type="html">&lt;p align="justify"&gt;Este verano participar&amp;eacute; junto con Fernando Llopis y Rodrigo D&amp;iacute;az en un curso destinado a explicar las bases de la programaci&amp;oacute;n de videojuegos enfocadas en la plataforma Windows Phone 7. Ser&amp;aacute; del 25 al 28 de Julio en la Seu Universit&amp;agrave;ria de La Nuc&amp;igrave;a, en Alicante.&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;img style="display:block;float:none;margin-left:auto;margin-right:auto;" alt="SEU Universitaria y Plaza / Crystalzoo &amp;copy; Guillermo Luijk" src="http://www.plataformaarquitectura.cl/wp-content/uploads/2011/03/1299525664-img-3540-1000x630.jpg" width="365" height="230" /&gt;&lt;/p&gt;
&lt;p align="justify"&gt;En el cursillo veremos desde una introducci&amp;oacute;n a C#, hasta c&amp;oacute;mo programar en 2D y 3D para Windows Phone 7 y el sistema de publicaci&amp;oacute;n. De este modo tendremos una visi&amp;oacute;n global de lo que significa hacer el desarrollo de un videojuego, desde la idea inicial hasta la publicaci&amp;oacute;n en un Marketplace.&lt;/p&gt;
&lt;p align="justify"&gt;Aqu&amp;iacute; ten&amp;eacute;is la &lt;a href="http://web.ua.es/es/seus/cursos-verano/la-nucia/cursos-de-verano/desarrollo-de-aplicaciones-para-moviles-con-net.html"&gt;p&amp;aacute;gina del curso&lt;/a&gt; para que quien quiera, pueda asistir. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=195455" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author><category term="wp7" scheme="http://geeks.ms/blogs/aperez/archive/tags/wp7/default.aspx" /><category term="xna" scheme="http://geeks.ms/blogs/aperez/archive/tags/xna/default.aspx" /><category term="eventos" scheme="http://geeks.ms/blogs/aperez/archive/tags/eventos/default.aspx" /></entry><entry><title>[Webcast] Introducción a XNA para Windows Phone 7</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2011/04/27/webcast-introducci-243-n-a-xna-para-windows-phone-7.aspx" /><id>/blogs/aperez/archive/2011/04/27/webcast-introducci-243-n-a-xna-para-windows-phone-7.aspx</id><published>2011-04-26T23:32:40Z</published><updated>2011-04-26T23:32:40Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h5 align="justify"&gt;&lt;a href="http://aperezgil.blogspot.com/2010/12/webcast-introduccion-xna-para-windows.html"&gt;[Webcast] Introducción a XNA para Windows Phone 7&lt;/a&gt;&lt;/h5&gt;  &lt;p align="justify"&gt;El pasado&amp;#160; mes de Noviembre se organizó en Madrid una Codecamp para 150 personas con el objetivo de desarrollar en dos días un juego para Windows Phone 7, a la que acudí como “experto”. Previamente se creó un contenido de formación para todos los asistentes, y en mi caso me ocupé del primer webcast que sirvió de Introducción a XNA para Windows Phone 7:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://lh4.ggpht.com/_1uYdolHvAj8/TPWmjhyYVLI/AAAAAAAAAGU/6ZIMqohn9Xk/s1600-h/image%5B3%5D.png"&gt;&lt;img style="display:block;float:none;margin-left:auto;margin-right:auto;" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1uYdolHvAj8/TPWmkDMAJ0I/AAAAAAAAAGY/H1XyuNrKztY/image_thumb%5B1%5D.png?imgmax=800" width="415" height="324" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;El contenido se compone de los siguientes puntos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p align="justify"&gt;Introducción a Windows Phone 7 desde el punto de vista del terminal.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p align="justify"&gt;Creando juegos para WP7: Explico las principales características de WP7 que soporta XNA.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p align="justify"&gt;Demo básica: Crear un proyecto desde cero y trastear con la orientación del teléfono.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p align="justify"&gt;Demo PeterBeer: Minijuego de ejemplo&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p align="justify"&gt;Demos de Creators: Demos de ejemplo descargadas desde Creators para demostrar las capacidades de WP7&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p align="justify"&gt;SlugKiller: Comentaré brevemente el juego que hice en la CodeCamp anterior.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p align="justify"&gt;Consejos: Dada la experiencia de la codecamp anterior, daré una serie de consejos bastante recomendables para que los asistentes a la codecamp logren llevar su proyecto al éxito.&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Si quieres verlo, puedes hacerlo a través del &lt;a href="https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032471851&amp;amp;EventCategory=5&amp;amp;culture=es-ES&amp;amp;CountryCode=ES"&gt;siguiente enlace&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=193031" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author><category term="wp7" scheme="http://geeks.ms/blogs/aperez/archive/tags/wp7/default.aspx" /><category term="webcast" scheme="http://geeks.ms/blogs/aperez/archive/tags/webcast/default.aspx" /><category term="xna" scheme="http://geeks.ms/blogs/aperez/archive/tags/xna/default.aspx" /></entry><entry><title>[WPF/Silverlight] Binding de objetos relacionados en un ComboBox</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2011/04/08/wpf-silverlight-binding-de-objetos-relacionados-en-un-combobox.aspx" /><id>/blogs/aperez/archive/2011/04/08/wpf-silverlight-binding-de-objetos-relacionados-en-un-combobox.aspx</id><published>2011-04-08T00:48:03Z</published><updated>2011-04-08T00:48:03Z</updated><content type="html">&lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Escenario: Tengo dos entidades relacionadas. La entidad A se relaciona con la entidad B a través de un identificador. Y lo que quiero es bindear eso, pero de modo que yo disponga en la interfaz de un combobox –o cualquier tipo de selección- que permita seleccionar todos los elementos. Entonces tenemos las siguientes tareas:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Bindear los datos del campo con el identificador de la identidad.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Pero yo no quiero ver un número. Yo quiero ver el nombre del objeto que relaciono. Por lo tanto, tendré un combobox que rellenar y bindear con respecto al identificador anteriormente citado.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Y claro, para hacerlo bueno, bonito y barato, nada de hacerlo en el código. Todo debe ir en el XAML.&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;El primer enfoque puede ir dirigido a un binding normal. Es decir, obviamente tenemos que tener en cuenta el ID de la entidad A, puesto que ese será el valor elegido a mostrar. Y como quiero rellenar todo el combobox con el resto de entidades B, usaremos un Converter:&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:411fe4c1-f691-4853-9c8c-cb08e2554478" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ComboBox&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Converter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;={&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ResourceKey&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=Converter}}&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;De este modo ya podemos ver todos los valores de la entidad B. Y además, en el converter podemos declarar cómo queremos mostrar cada Item:&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:35d32c3b-da4a-4031-aae3-bcaa3c806962" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyIDConverter&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IValueConverter&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; Convert(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; value, &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; targetType, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; parameter, System.Globalization.&lt;span style="color:#2b91af;"&gt;CultureInfo&lt;/span&gt; culture)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ComboBoxItem&lt;/span&gt;&amp;gt; list = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ComboBoxItem&lt;/span&gt;&amp;gt;();            &lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;B&lt;/span&gt; b &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;B&lt;/span&gt;.All())&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            {&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#2b91af;"&gt;ComboBoxItem&lt;/span&gt; comboItem = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ComboBoxItem&lt;/span&gt;();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                comboItem.Content = b.Name;&lt;/li&gt; &lt;li&gt;                comboItem.Tag = b;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                list.Add(comboItem);&lt;/li&gt; &lt;li&gt;            }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; list;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; ConvertBack(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; value, &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; targetType, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; parameter, System.Globalization.&lt;span style="color:#2b91af;"&gt;CultureInfo&lt;/span&gt; culture)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;Ahora lo que falta es enlazar el ID de A para que el combobox tenga como seleccionado el item de B correspondiente. Dentro del primero enfoque, sería usar otro converter para ello, pero tenemos un problema: necesito obtener el combobox para indicarle SelectedItem. De acuerdo, podemos declarar un parámetro en el Converter y le pasaremos el propio combobox del siguiente modo:&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:04323636-b043-4154-8237-bec41611b522" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ComboBox&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Converter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;={&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ResourceKey&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=Converter},&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ConverterParameter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;={&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RelativeSource&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Mode&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=Self}}&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;Pero esto directamente no compila. ¿Por qué? Porque los parámetros que se pasan al Converter deben ser constantes y no objetos variables. Es decir, le puedo pasar binding de propiedades como objetos ya que las considera “constantes”, pero el propio objeto comboBox (que al bindearlo se convierte en un puntero this) va cambiando. Una solución a esto es añadir manualmente dicho combobox como un DependencyProperty propio de la clase. Y otra solución es escribir el código necesario para que esto funcione en el codebehind. Pero recuerdo que el objetivo de esto es usar únicamente el XAML&lt;/p&gt;  &lt;p align="justify"&gt;¿Solución? El segundo enfoque. Simplemente consiste en añadir, además del primer Converter para rellenar el comboBox, otro que se dedique a bindear el contenido del combobox con el identificador de la entidad A. Se implementa la interfaz IMultiValueConverter que permite bindear a la vez varios elementos sobre una misma propiedad. De este modo, bindearemos la propiedad identificador de B que aparece en A como relación junto con el propio ComboBox. Y lo bindearemos al SelectedIndex de ComboBox, para que cargue el objeto B apropiado y además, que al seleccionar otro, modifique el identificador que corresponda.&lt;/p&gt;  &lt;p align="justify"&gt;Veamos el código:&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e481b35b-b802-4cf5-a0d8-51b55f6b9d6b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                            &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ComboBox&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ComboBox.ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                                    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Converter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ResourceKey&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=MyIDConverter}&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                                &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ComboBox.ItemsSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ComboBox.SelectedIndex&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                                    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Converter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; ResourceKey&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=MyIDtoIDConverter}&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; UpdateSourceTrigger&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;PropertyChanged&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                        &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MultiBinding.Bindings&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                                            &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;BID&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Mode&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;TwoWay&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                            &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; RelativeSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RelativeSource&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Mode&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=Self}&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; Path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;.&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                                        &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MultiBinding.Bindings&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                    &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                                &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ComboBox.SelectedIndex&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ComboBox&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                        &lt;span style="color:#a31515;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;Y ahora la implementación del IMultiValueConverter&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4a50a8d2-a9a9-464e-93af-a54d3055cffd" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MyIDtoIDConverter&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IMultiValueConverter&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ComboBox&lt;/span&gt; combo;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; MyIDtoIDConverter()&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        combo = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; Convert(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] values, &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; targetType, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; parameter, System.Globalization.&lt;span style="color:#2b91af;"&gt;CultureInfo&lt;/span&gt; culture)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.combo = values[1] &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ComboBox&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#2b91af;"&gt;ComboBoxItem&lt;/span&gt; comboItem = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;ComboBoxItem&lt;/span&gt; item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; combo.Items)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#2b91af;"&gt;OperationType&lt;/span&gt; operationType = item.Tag &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;OperationType&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (operationType.Id == values[0] &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;?)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            {&lt;/li&gt; &lt;li&gt;                comboItem = item;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                combo.SelectedIndex = index;&lt;/li&gt; &lt;li&gt;            }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            index++;&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; combo.SelectedIndex;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] ConvertBack(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; value, &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt;[] targetTypes, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; parameter, System.Globalization.&lt;span style="color:#2b91af;"&gt;CultureInfo&lt;/span&gt; culture)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#2b91af;"&gt;ComboBoxItem&lt;/span&gt; comboItem = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.combo.Items[(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)value] &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ComboBoxItem&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af;"&gt;B&lt;/span&gt; b = comboItem.Tag &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;B&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] { b.ID };&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;/p&gt;  &lt;p align="justify"&gt;El Converter almacena el comboBox para que después al hacer el ConvertBack, tenga la referencia del estado de los items. De este modo, tenemos las entidades bindeadas con las propiedades de los elementos de WPF y además manteniendo sus relaciones.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=191906" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author><category term="silverlight" scheme="http://geeks.ms/blogs/aperez/archive/tags/silverlight/default.aspx" /><category term="wpf" scheme="http://geeks.ms/blogs/aperez/archive/tags/wpf/default.aspx" /><category term="binding" scheme="http://geeks.ms/blogs/aperez/archive/tags/binding/default.aspx" /></entry><entry><title>[W7] Liberar puerto 80 en Windows 7</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2011/04/06/w7-liberar-puerto-80-en-windows-7.aspx" /><id>/blogs/aperez/archive/2011/04/06/w7-liberar-puerto-80-en-windows-7.aspx</id><published>2011-04-06T21:04:24Z</published><updated>2011-04-06T21:04:24Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Normalmente para depurar cualquier website se suele emplear el propio puerto 80. En el caso de Azure, podemos tener el inconveniente de forzar el rol a que vaya en ese puerto pero por estar ocupado, se le asigna otro: 81, 82, y los siguientes.&lt;/p&gt;  &lt;p align="justify"&gt;Nuestro primer problema será liberar el puerto 80. Y para eso no hay nada como averiguar qué está ocupando dicho puerto. Lo primero es abrir la consola de comandos y escribir el siguiente comando que nos indicará qué puertos están actualmente a la escucha y el proceso asociado:&lt;/p&gt;  &lt;p align="justify"&gt;netstat –ab&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_30595F70.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_thumb_5F00_2DD02DB2.png" width="443" height="225" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Una vez viendo esto, podemos buscar el proceso a través del Administrador de Tareas y cerrarlo. El problema aquí puede ser lo que se aprecia en la imagen: no podemos ver qué proceso está ocupando el puerto 80. Evidentemente algo hay (es un proceso de sistema: podemos aplicar el comando netstat –anno para saber exactamente qué proceso es el que está ocupando el puerto), pero no nos indica nada. Y no hay ningún modo de saberlo.&lt;/p&gt;  &lt;p align="justify"&gt;Un modo de arreglarlo a fuerza bruta sería cancelar todos los servicios hasta que se libere el puerto. Pero es más fácil en nuestro contexto sin contamos con SQL Server. Simplemente, tenemos que deshabilitar los siguientes servicios y programas:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Skype: Suele ir por el puerto 80. Mejor no tenerlo activo.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;IIS: Suele estar configurado para estar escuchando el puerto 80. &lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Y ahora empieza lo bueno, deshabilitando los siguientes servicios:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;SQL Reporting Services: No aparece por ningún lado. Pero está camuflado bajo un proceso de sistema. Y funciona a través del puerto 80.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;SQL Integration Services: Ídem del anterior.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Con esto, ya tenemos liberado el puerto 80 totalmente para nosotros:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_5F0EF245.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_thumb_5F00_3406DE73.png" width="465" height="236" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=191813" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author></entry><entry><title>[WP7] An update to Visual Studio is required to open Silverlight for Windows Phone</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2011/04/03/wp7-an-update-to-visual-studio-is-required-to-open-silverlight-for-windows-phone.aspx" /><id>/blogs/aperez/archive/2011/04/03/wp7-an-update-to-visual-studio-is-required-to-open-silverlight-for-windows-phone.aspx</id><published>2011-04-03T01:27:33Z</published><updated>2011-04-03T01:27:33Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Este error me ha surgido al abrir mis antiguos proyectos para Windows Phone 7, incluso después de instalar todas las últimas actualizaciones de las Windows Phone Tools y reiniciar contínuamente. ¿La solución? Pues la encontré en el &lt;a href="http://forums.create.msdn.com/forums/p/70067/431795.aspx"&gt;foro de desarrolladores&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Lo único que hay que hacer es volver a enlazar la dll de Design.Platform de nuevo a Visual Studio, para ello:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Abrir la consola de comandos en modo administrador &lt;/li&gt;    &lt;li&gt;Ir hasta&lt;strong&gt; c:\ProgramFiles\Microsoft SDKs\Windows\v7.0A\bin\NETFX4.0&lt;/strong&gt;. Si estás con Windows de 64 bits, entonces tienes que ir hasta ProgramFiles(x86). &lt;/li&gt;    &lt;li&gt;Ejecutar el siguiente comando: - &lt;strong&gt;gacutil /i &amp;quot;%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\Microsoft.Windows.Design.Platform.dll&amp;quot; /f. &lt;/strong&gt;Del mismo modo que antes, si estamos con 64 bits debemos especificar la carpeta ProgramFiles(x86) &lt;/li&gt;    &lt;li&gt;Verificar que al ejecutar el comando, pone: &amp;quot;Assembly successfully added to the cache”. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Aquí dejo una captura de pantalla:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_395B3A1A.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/aperez/image_5F00_thumb_5F00_4C8BA0BD.png" width="436" height="220" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=191563" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author><category term="vs2010" scheme="http://geeks.ms/blogs/aperez/archive/tags/vs2010/default.aspx" /><category term="wp7" scheme="http://geeks.ms/blogs/aperez/archive/tags/wp7/default.aspx" /><category term="silverlight" scheme="http://geeks.ms/blogs/aperez/archive/tags/silverlight/default.aspx" /></entry><entry><title>[C#] Instancias en runtime de tipos dinámicos</title><link rel="alternate" type="text/html" href="/blogs/aperez/archive/2011/04/03/c-instancias-en-runtime-de-tipos-din-225-micos.aspx" /><id>/blogs/aperez/archive/2011/04/03/c-instancias-en-runtime-de-tipos-din-225-micos.aspx</id><published>2011-04-03T01:25:02Z</published><updated>2011-04-03T01:25:02Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Durante el desarrollo de algunas herramientas es necesario generalizarlas para poder reutilizarlas posteriormente, pero manteniendo siempre una funcionalidad concreta. En el caso que nos ocupa, quiero poder listar una serie de atributos genéricos y poder operar con ellos en la precisión deseada, pero partiendo de la premisa anterior. Es decir, no tendré una clase que disponga de algo similar:&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:487px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:096deb51-77d2-4caf-8644-d8b67146d1c5" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;A&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; a;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;float&lt;/span&gt; b;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; c;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#2b91af;"&gt;UInt16&lt;/span&gt; x;&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;Esto es muy costoso de mantener en futuros proyectos, puesto que estaría obligado a cambiar manualmente todos los atributos del objeto y sus nombres pese a que el comportamiento puede estar definido, puesto que sólo me interesa poder operar con los números. &lt;/p&gt;  &lt;p align="justify"&gt;¿Solución? Pues muy sencillo. Por un lado, vamos a almacenar únicamente el&amp;#160; nombre de atributo junto con su tipo y valor, todo con string. Posteriormente usaremos reflection para cargar el tipo de forma dinámica. Hasta aquí todo es correcto, nuestro mayor problema será que el evidentemente esos objetos dinámicos no son tipados y el compilador no sabrá qué son salvo que lo especifiquemos explícitamente mediante un casting. Es por ello que aquí entran los tipos dinámicos.&lt;/p&gt;  &lt;p align="justify"&gt;Los &lt;a href="http://msdn.microsoft.com/en-us/library/dd264741.aspx"&gt;tipos dinámicos&lt;/a&gt; (o &lt;a href="http://msdn.microsoft.com/en-us/library/dd264741.aspx"&gt;dynamic type&lt;/a&gt;, en inglés) es una nueva feature de C# 4.0. Recomiendo la lectura de la documentación para no caer en el error de confundirlos con los &lt;a href="http://msdn.microsoft.com/en-us/library/bb397696.aspx"&gt;tipos anónimos&lt;/a&gt;. Debemos tener en cuenta que lo que queremos es operar con ellos en tiempo de ejecución, por lo que toda operación no soportada en tiempo de compilación por un tipo no nos servirá. De ahí que los tipos anónimos no sirva para el siguiente ejemplo, ya que no puedo operar entre objetos sin especificar explícitamente qué quiero hacer.&lt;/p&gt;  &lt;p align="justify"&gt;Es por ello que una vez tenemos el tipo deseado a instanciar mediante Reflection, podemos asignarle el valor y el tipo a la variable dinámica. Y podremos operar con ellos como si se tratase de tipos compilados previamente. Veamos un ejemplo:&lt;/p&gt;  &lt;div style="padding-bottom:0px;padding-left:0px;width:470px;padding-right:0px;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2f3e0a56-195b-492a-936f-afa003e63ac4" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; uno = &lt;span style="color:#a31515;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; dos = &lt;span style="color:#a31515;"&gt;&amp;quot;2,5&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;dynamic&lt;/span&gt; a = &lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ChangeType(uno, &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt;.GetType(&lt;span style="color:#a31515;"&gt;&amp;quot;System.Single&amp;quot;&lt;/span&gt;));&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff;"&gt;dynamic&lt;/span&gt; b = &lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ChangeType(dos, &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt;.GetType(&lt;span style="color:#a31515;"&gt;&amp;quot;System.Single&amp;quot;&lt;/span&gt;));&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Out.WriteLine(a);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Out.WriteLine(b);&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Out.WriteLine(a+b);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Out.WriteLine(a-b);&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Out.WriteLine(a*b);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Out.WriteLine(a/b);&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadLine();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="justify"&gt;A través de Type.GetType() uso Reflection para cargar el tipo que quiero instanciar. Con Convert.ChangeType asigno un valor a un tipo, y todo ello a una variable dinámica. De este modo podremos operar con los números como si se tratasen de floats.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=191562" width="1" height="1"&gt;</content><author><name>andres.perez</name><uri>http://geeks.ms/members/andres.perez/default.aspx</uri></author><category term="c#" scheme="http://geeks.ms/blogs/aperez/archive/tags/c_2300_/default.aspx" /></entry></feed>