<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El Blog de Fox</title>
	<atom:link href="http://blog.foxandxss.net/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.foxandxss.net</link>
	<description>Fomentando el desarrollo y el software libre bajo .NET</description>
	<lastBuildDate>Tue, 16 Mar 2010 11:57:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Expression Blend 4 Beta y Silverlight 4 RC</title>
		<link>http://blog.foxandxss.net/index.php/expression-blend-4-beta-y-silverlight-4-rc/</link>
		<comments>http://blog.foxandxss.net/index.php/expression-blend-4-beta-y-silverlight-4-rc/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 11:57:09 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Blend]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=188</guid>
		<description><![CDATA[Los que usamos Visual Studio 2010 RC estamos de enhorabuena.
La release de Visual Studio 2010 RC tenia 2 grandes puntos negros:
Silverlight 4 Beta no funcionaba en VS 2010 RC sabes dios por qué, la cosa es que nos dijeron que esperasemos a una nueva release de Silverlight, y claro, ahora que estos días es el [...]]]></description>
			<content:encoded><![CDATA[<p>Los que usamos Visual Studio 2010 RC estamos de enhorabuena.</p>
<p>La release de Visual Studio 2010 RC tenia 2 grandes puntos negros:</p>
<p>Silverlight 4 Beta no funcionaba en VS 2010 RC sabes dios por qué, la cosa es que nos dijeron que esperasemos a una nueva release de Silverlight, y claro, ahora que estos días es el MIX 2010 pues han aprovechado para anunciar Silverlight 4 RC el cual es compatible con el último VS.</p>
<p>Os dejo aquí el enlace de la descarga:<br />
<a href="http://go.microsoft.com/fwlink/?LinkID=141284"><br />
Herramientas de Silverlight 4 para Visual Studio 2010</a><br />
<a href="http://go.microsoft.com/fwlink/?LinkID=169408"><br />
SDK de Silverlight 4</a></p>
<p><a href="http://silverlight.codeplex.com/">Silverlight toolkit (Opcional)</a></p>
<p>Por otro lado había una Preview de Blend 3 con soporte para WPF 4 y Silverlight 4, pero esta preview dejó de funcionar con Visual Studio 2010 RC así que sólo tocaba esperar para una versión con soporte que según los desalladores, saldría pronto y claro han aprovechado el MIX 2010 también. Así que ahora tenemos Blend 4 Beta disponible para todos <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6f014e07-0053-4aca-84a7-cd82f9aa989f">Blend 4 Beta</a></p>
<p>Y por favor, no seais tan tontos como yo que me volví loco con la key que pide&#8230; Solo has de hacer click en el enlace que os da el instalador cuando os pide la key, ahí podeis crear una.</p>
<p>Por último, han sacado un add-in para Windows Phone 7 para Blend 4 y aunque el telefono no está en la calle, trae un emulador por si quiereis ir probando:</p>
<p><a href="http://www.microsoft.com/expression/try-it/Default.aspx#PageTop">Paquetes necesarios</a></p>
<p>Un saludo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/expression-blend-4-beta-y-silverlight-4-rc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Analizando ReSharper</title>
		<link>http://blog.foxandxss.net/index.php/analizando-resharper/</link>
		<comments>http://blog.foxandxss.net/index.php/analizando-resharper/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 20:01:58 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Análisis]]></category>
		<category><![CDATA[Add-in]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=184</guid>
		<description><![CDATA[Hola,
Por primera vez en el blog, quiero hacer un análisis, en este caso el honor lo tiene ReSharper o también conocido como R#.
¿Qué es exactamente ReSharper?

ReSharper es un add-in de Visual Studio, y qué mejor para explicar qué hace que una libre traducción desde su página web:

Resharper resalta los errores de toda la solución al [...]]]></description>
			<content:encoded><![CDATA[<p>Hola,</p>
<p>Por primera vez en el blog, quiero hacer un análisis, en este caso el honor lo tiene <b>ReSharper</b> o también conocido como <b>R#</b>.</p>
<p>¿Qué es exactamente ReSharper?<br />
<span id="more-184"></span><br />
ReSharper es un add-in de Visual Studio, y qué mejor para explicar qué hace que una libre traducción desde su página web:</p>
<blockquote><p>
Resharper resalta los errores de toda la solución al vuelo, soluciones instantaneas para dichos errores, más de 30 técnicas avanzadas de refactorización, herramientas de pruebas unitarias, funciones de búsqueda y navegación, formateado y limpieza de código, generación automatica de código y muchas cosas más para C#, VB.NET, ASP.NET, XML y XAML.
</p></blockquote>
<p>Vamos, que te hace de todo menos la cena <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Yo soy de los que no muestran mucho interes de cara a un add-in de cualquier aplicación, pero me dió por probar este por recomendación y la verdad, no puedo vivir sin el.</p>
<p>Voy a comentar con unas cuentas screenshots algunas de las features que he ido viendo sobre ReSharper. Hay decenas y todavía tengo que descubrir muchas útiles jeje.</p>
<p>Crearé una pequeña app de consola puesto que para el caso, no necesitamos ni ejecutar los programas.</p>
<p>Si ir más lejos, nada más crear la aplicación, ReSharper ya nos está marcando cosas ( lo suele hacer cambiando el color a gris ):</p>
<p><a href="http://foxandxss.net/CosasBlog/resharper/1.JPG"><img alt="" src="http://foxandxss.net/CosasBlog/resharper/1.JPG" class="alignnone" width="461" height="239" /></a></p>
<p>Aquí vemos las directivas using en gris, si ponemos el ratón encima nos dice: &#8220;La directiva using no está siendo usada y puede ser borrada&#8221;</p>
<p>Lo mismo con el parámetro &#8220;args&#8221; del método Main, el cual nos dice que no está siendo usado.</p>
<p>Esto es bastante útil por varias razones, entre ellas, nos ayuda a refactorizar nuestro código y borrar todo aquello que no vale (Lo tipico, creas una ventana o algo y te mete 20 using del cual usarás 1-2.</p>
<p>Como si de Eclipse se tratara, ReSharper nos trae a Visual Studio una forma de ver los avisos y errores de un fichero de un solo vistazo:</p>
<p><a href="http://foxandxss.net/CosasBlog/resharper/2.JPG"><img alt="" src="http://foxandxss.net/CosasBlog/resharper/2.JPG" class="alignnone" width="399" height="176" /></a></p>
<p>Cada rayita indica algo, las naranjas son avisos, las rojas errores, azules son TODO&#8217;s que pongas&#8230;</p>
<p>Luego también como hacen muchos IDE&#8217;s de Java, tenemos ayuda basada en el contexto ( donde tengamos el cursor vaya), por ejemplo si pinchamos en args, nos saldrá un icono, el cual nos ofrece varias opciones:</p>
<p><a href=" http://foxandxss.net/CosasBlog/resharper/3.JPG"><img alt="" src=" http://foxandxss.net/CosasBlog/resharper/3.JPG" class="alignnone" width="493" height="226" /></a></p>
<p>Borrar el parámetro, crear una sobrecarga sin parámetro, ignorar el mensaje&#8230;</p>
<p>Todo esto y todavía no hemos escrito nada jeje.</p>
<p>Ahora imaginad que escribo algún atributo privado</p>
<p><a href="http://foxandxss.net/CosasBlog/resharper/4.JPG"><img alt="" src="http://foxandxss.net/CosasBlog/resharper/4.JPG" class="alignnone" width="266" height="142" /></a></p>
<p>¿Qué es esa linea azul? Si dejamos el ratón encima nos dirá (aparte de que no está siendo usada) que el atributo no cumple con la convención de atributos privados, te sugiere que lo cambies por: &#8220;_mensaje&#8221;.</p>
<p>Ahora vamos a crear una propiedad autoimplementada y la usamos en nuestro main:</p>
<p><a href=" http://foxandxss.net/CosasBlog/resharper/5.JPG"><img alt="" src=" http://foxandxss.net/CosasBlog/resharper/5.JPG" class="alignnone" width="348" height="163" /></a></p>
<p>Nada extraño, pero si nos fijamos en el <i>get</i> vemos que tiene otra linea azul. Si dejamos ahi el cursor nos dice que el get no está siendo usado, que podemos borrarlo. Es aquí otra ayuda a la refactorización.</p>
<p>Vamos a crear una clase que nos sirva para más ejemplos: (La pongo en imagen para ver otro aviso de ReSharper)</p>
<p><a href=" http://foxandxss.net/CosasBlog/resharper/6.JPG"><img alt="" src=" http://foxandxss.net/CosasBlog/resharper/6.JPG" class="alignnone" width="331" height="189" /></a><br />
Nada nuevo aquí, pero oh, ReSharper a marcado el <i>this</i>&#8230; Nos dice que el this aquí es redundante.</p>
<p>Bueno, de vuelta al Main, vamos a crear una lista de Libros:</p>
<p><a href=" http://foxandxss.net/CosasBlog/resharper/7.JPG"><img alt="" src=" http://foxandxss.net/CosasBlog/resharper/7.JPG" class="alignnone" width="439" height="133" /></a></p>
<p>Uh, ReSharper se ha cebado con la creacion de la lista&#8230;</p>
<p>¿Por qué marca el List<Libro>? Quizá esto sea algo más controvertido, pero ahora se está poniendo más de moda entre los desarrolladores a cambiar el modo en el que inicialian los objetos.</p>
<p>En este caso quedaría así:</p>
<pre class="brush: csharp;">
var libros = new List&lt;Libro&gt;();
</pre>
<p>No es que nos estemos volviendo dinámicos estilo Python, simplemente consideran que no es necesario ver dos veces List<Libro> que con una va bien y el resto es solo redundancia. Siempre y cuando dicho objeto sea local a un método y no como atributo de una clase ni nada. Al ser algo temporal pues piensan que no hace falta poner que tipo de variable es puesto que se puede deducir en la asignación.</p>
<p>¿Y el new? Aquí es donde entra un poco de la magia de ReSharper. Nos ofrece la posibilidad de fusionar las lineas de abajo y meterlas en la inicialización de la Lista.</p>
<p>Finalmente todo quedaría así:</p>
<p><a href="http://foxandxss.net/CosasBlog/resharper/8.JPG"><img alt="" src="http://foxandxss.net/CosasBlog/resharper/8.JPG" class="alignnone" width="464" height="130" /></a></p>
<p>¿Mola eh?</p>
<p>Ahora imaginad que quereis cambiar los temas de &#8220;Prog&#8221; a &#8220;Programación&#8221;, podéis hacer algo en plan:</p>
<p><a href="http://foxandxss.net/CosasBlog/resharper/9.JPG"><img alt="" src="http://foxandxss.net/CosasBlog/resharper/9.JPG" class="alignnone" width="282" height="93" /></a></p>
<p>Nada mal, pero&#8230; ¿Qué sale debajo del foreach? ¿Dice que parte del foreach puede convertirse a algo LINQ? ¿Y que lo hará por nosotros? Pos fale.</p>
<p><a href="http://foxandxss.net/CosasBlog/resharper/10.JPG"><img alt="" src="http://foxandxss.net/CosasBlog/resharper/10.JPG" class="alignnone" width="474" height="79" /></a></p>
<p>Esto ya mola más, ¿Eh? Ahora tenemos un foreach que itera por aquellos libros que son de programación. O sea, ya es más rápido.</p>
<p>Vamos a hacer la lista de libros más grande, con más temas:</p>
<pre class="brush: csharp;">
var libros = new List&lt;Libro&gt;
             {
                 new Libro(&quot;Programacion&quot;, &quot;C# In Depth&quot;),
                 new Libro(&quot;Cocina&quot;, &quot;Cocina para novatos&quot;),
                 new Libro(&quot;Programacion&quot;, &quot;Linq In Action&quot;),
                 new Libro(&quot;Redes&quot;, &quot;Cisco CCNA&quot;),
                 new Libro(&quot;Bases de datos&quot;, &quot;SQL Server 2008&quot;),
                 new Libro(&quot;Cocina&quot;, &quot;Como cocinar pescado&quot;)
              };
</pre>
<p>Ahora imaginad que queremos crear una segunda lista de libros que solo contenga los de informática:<br />
<a href=" http://foxandxss.net/CosasBlog/resharper/11.JPG"><img alt="" src=" http://foxandxss.net/CosasBlog/resharper/11.JPG" class="alignnone" width="514" height="212" /></a></p>
<p>Ahora los dos foreach están marcados, y en estos casos es mejor empezar por el externo e ir aplicando los que nos dice ya que muchas veces afecta a lo de adentro (de una forma positiva claro).</p>
<p>En este caso nos dice que todo el bucle puede convertirse en algo LINQ:</p>
<pre class="brush: csharp;">
var librosInformatica = (from tema in temas from libro in libros where libro.Tema == tema select libro).ToList();
</pre>
<p>Aunque a veces puede salir con un:</p>
<pre class="brush: csharp;">
var librosInformatica = temas.SelectMany(tema =&gt; libros.Where(libro =&gt; libro.Tema == tema)).ToList();
</pre>
<p>Ambos hacen lo mismo, no sé por qué a veces te lo convierte de una forma y a veces de otra, aunque la cosa es que te quita los 2 bucles y el if <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Y bueno, esto es solo la punta del iceberg de lo que ReSharper nos ofrece&#8230;</p>
<p>Es capaz de analizar tu código y decirte cuando algo que tienes público puede ser privado, te avisa cuando usas una variable que podría contener null y tu no lo has comprobado antes, te da soluciones para reducir anidamiento&#8230; Y luego ya lo tipico, mover código a métodos, cambiar nombre&#8230; Vamos, todo lo que hay para refactorizar código.</p>
<p>Por último, decir que todo esto es configurable a través de reglas las cuales pueden ser modificadas, borradas y incluso crear las tuyas propias.</p>
<p>¿Lo malo? Que la licencia es de pago. Tienes un trial de 30 días también. Merece la pena conseguirlo <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Os dejo un enlace a la página oficial y otro a su lista de features:</p>
<p><a href="http://www.jetbrains.com/resharper">http://www.jetbrains.com/resharper</a>/<br />
<a href="http://www.jetbrains.com/resharper/features/index.html">http://www.jetbrains.com/resharper/features/index.html</a></p>
<p>Nada más, un saludo y si os gusta, comentad <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/analizando-resharper/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Apunta notas ahora en CodePlex</title>
		<link>http://blog.foxandxss.net/index.php/apunta-notas-ahora-en-codeplex/</link>
		<comments>http://blog.foxandxss.net/index.php/apunta-notas-ahora-en-codeplex/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 19:44:20 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Mis Programas]]></category>
		<category><![CDATA[MVVM]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=181</guid>
		<description><![CDATA[Hola,
Qué de tiempo sin escribir nada, pero vuelvo con ganas para escribir más  
Decir que reescribí completamente Apunta Notas, ahora en inglés, usando mvvm light (del cual me gustaría hablar en un futuro). Aun habiendolo escrito en inglés, si teneis el Windows en castellano os aparecerá en castellano  
Os dejo la URL donde [...]]]></description>
			<content:encoded><![CDATA[<p>Hola,</p>
<p>Qué de tiempo sin escribir nada, pero vuelvo con ganas para escribir más <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Decir que reescribí completamente Apunta Notas, ahora en inglés, usando mvvm light (del cual me gustaría hablar en un futuro). Aun habiendolo escrito en inglés, si teneis el Windows en castellano os aparecerá en castellano <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Os dejo la URL donde tengo alojado el projecto:</p>
<p><a href="http://apuntanotas.codeplex.com/">http://apuntanotas.codeplex.com/</a></p>
<p>Un saludo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/apunta-notas-ahora-en-codeplex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TwitFox 1.0</title>
		<link>http://blog.foxandxss.net/index.php/twitfox-1-0/</link>
		<comments>http://blog.foxandxss.net/index.php/twitfox-1-0/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 13:52:01 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Mis Programas]]></category>
		<category><![CDATA[Blend]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVP]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=174</guid>
		<description><![CDATA[Hola!
He creado un cliente de Twitter, es un cliente sencillito que he hecho con el proposito de aprender y de divertirme un poco.
Os dejo una screen:


Mi primera intención era la de crear un artículo explicando paso por paso como crear un cliente Twitter, pero la verdad es que aunque simple el cliente, ha terminado con [...]]]></description>
			<content:encoded><![CDATA[<p>Hola!</p>
<p>He creado un cliente de <b>Twitter</b>, es un cliente sencillito que he hecho con el proposito de aprender y de divertirme un poco.</p>
<p>Os dejo una screen:</p>
<p><a href="http://www.foxandxss.net/misprogramas/twitfox/principal.PNG"><img alt="ScreenTwitFox" src="http://www.foxandxss.net/misprogramas/twitfox/principal.PNG" class="alignnone" width="467" height="720" /></a><br />
<span id="more-174"></span></p>
<p>Mi primera intención era la de crear un artículo explicando paso por paso como crear un cliente Twitter, pero la verdad es que aunque simple el cliente, ha terminado con más código del que pensaba.</p>
<p>Aun así os daré algunos detalles para que cuando mirés el código pues sepais más o menos qué hace cada cosa.</p>
<p>No he usado ninguna librería concreta para desarrollar esta primera versión del cliente de Twitter. Simplemente he usado el <b>REST API</b> el cual es bastante limitado.</p>
<p>La clase <i>TwitterClient</i> es la que nos permitirá descargar nuestros Tweets y cambiar nuestro estado. No hace nada más. Cuando cambie la librería, añadiré más opciones a la interfaz de dicha clase sin modificar las opciones que ya hay.</p>
<p>Podeis observar que la clase lo que hace es descargar un XML con los tweets y parsearlos.</p>
<p>Por otro lado, podéis ver que la estructura del proyecto es MVP aunque le he añadido tambien la clase <i>DelegateCommand</i> para usar comandos siempre que sea posible.</p>
<p>Lo más complejo del proyecto es la UI, en la cual he usado <b>Data Templates</b>, <b>Fake DataContext</b> (Dos cosas que habéis aprendido aquí), además de un botón custom con una pequeña animación.</p>
<p>El código de la UI quizá sea un poco guarrete, pero es la primera aplicación que hago usando <b>Blend 3</b> como aplicación de diseño principal.</p>
<p>Nada más, os dejo aquí el enlace a la aplicación:</p>
<p><a href="http://www.foxandxss.net/misprogramas/twitfox/twitfox.php">TwitFox</a></p>
<p>Un saludo!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/twitfox-1-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Patrones de diseño</title>
		<link>http://blog.foxandxss.net/index.php/patrones-de-diseno/</link>
		<comments>http://blog.foxandxss.net/index.php/patrones-de-diseno/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 21:28:40 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=168</guid>
		<description><![CDATA[Hola!
Tengo pensado hacer una serie de artículos sobre patrones de diseño.
Iré colocando al menos un par de veces al mes, un artículo enfocado a un patrón de diseño en concreto. Escribiré el motivo del patrón con un buen ejemplo y sobre el código, en un principio estará escrito enfocado a C#, usando las herramientas de [...]]]></description>
			<content:encoded><![CDATA[<p>Hola!</p>
<p>Tengo pensado hacer una serie de artículos sobre patrones de diseño.</p>
<p>Iré colocando al menos un par de veces al mes, un artículo enfocado a un patrón de diseño en concreto. Escribiré el motivo del patrón con un buen ejemplo y sobre el código, en un principio estará escrito enfocado a C#, usando las herramientas de las que C# nos provee. Eso si, en caso de que la implementación de C# sea tan tan tan especifica, intentaré proveer de un ejemplo más neutral.</p>
<p>Nada más, a ver si pongo uno esta semana <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Un saludo,<br />
Fox</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/patrones-de-diseno/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Reseña: C# In Depth</title>
		<link>http://blog.foxandxss.net/index.php/resena-c-in-depth/</link>
		<comments>http://blog.foxandxss.net/index.php/resena-c-in-depth/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 18:04:13 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Reseñas]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=156</guid>
		<description><![CDATA[¿Eres un programador de Java y quieres aprender C#? ¿O bien conoces lo básico de C# y quieres conocer todo lo que ofrece?
En ambos casos, bienvenidos a C# In Depth, EL libro avanzado de C# por excelencia.


Este libro tiene una finalidad muy concreta, enseñar qué ofrece C# 2 y 3.
Al ser un libro avanzado, necesita [...]]]></description>
			<content:encoded><![CDATA[<p>¿Eres un programador de Java y quieres aprender C#? ¿O bien conoces lo básico de C# y quieres conocer todo lo que ofrece?<br />
En ambos casos, bienvenidos a <b>C# In Depth</b>, <span style="font-size: 2em;">EL</span> libro avanzado de <b>C#</b> por excelencia.</p>
<p><a href="http://www.manning.com/skeet/skeet_cover150.jpg"><img alt="" src="http://www.manning.com/skeet/skeet_cover150.jpg" class="alignnone" width="150" height="189" /></a><br />
<span id="more-156"></span><br />
Este libro tiene una finalidad muy concreta, enseñar qué ofrece C# 2 y 3.<br />
Al ser un libro avanzado, necesita que o bien seáis programadores de Java o bien que conozcáis C# 1 como mínimo.<br />
Como ya he dicho, este libro es maravilla (sí, parece que todos los libros que leo son maravilla, eso o que pierdo mucho tiempo descartando libros para quedarme con uno decente <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ), aunque son solo 424 páginas, parecerá que son 2 mil, pues es muy denso.</p>
<p>El libro está dividido en 3 partes, cada una dedicada a las 3 versiones de <b>C#</b> que hay <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><b>Parte 1:</b><br />
Ya he dicho que este libro se centra en la versión 2 y 3 de <b>C#</b>, pero aun así, el autor quiere dedicar un poco de tiempo a hablarnos de lo que nos ofreció C# cuando nació y además de hacernos ver las cosas que se hacían mal en C# 1 y como C# 2 y 3 nos ofrecen una mejor alternativa para esos casos concretos.<br />
Por otro lado, esta parte empieza con lo típico y es que parece que ningún autor es capaz de resistir la tentación de poner la historia de C#, .NET y toda la pesca.<br />
Después de este aburrido capítulo, empieza ya lo interesante.<br />
Nos recordará algunas cosas básicas de C# para posteriormente mostrarnos que esas cosas maravillosas que usábamos, apestan y que ahora tenemos mejores formas de hacerlo. Básicamente lo que el autor quiere aquí es ponerte los dientes largos mostrándote por ejemplo como molan las <i>Lambdas</i>.</p>
<p><b>Parte 2:</b><br />
Ésta parte, titulada “Resolviendo los problemas de C# 1” se centrará en C# 2, el cual tiene jugosas novedades que hará que nuestro código C# sea mucho mejor <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<br />
Nos hablará de la necesidad de los genéricos aunque también de sus limitaciones.<br />
También abordará sobre los tipos ‘nullables’, lo cual nos ayudará cuando tratemos con bases de datos.<br />
Veremos cómo implementar mejores delegados gracias a los métodos anónimos.<br />
Un poco de iteradores también y para terminar un conjunto de cosas no menos importantes.</p>
<p><b>Parte 3:</b><br />
Esta parte es igual a la anterior, más features pero esta vez las de C# 3.<br />
Tipos anónimos, inicialización simplificada, lambda, métodos de extensión (extension methods) y sobre todo…. <b>LINQ</b>.<br />
Ahora es cuando os emocionáis como yo y decís, uhm <b>¡LINQ!</b>. Después de más de 300 páginas leídas, viene quizá lo más interesante.<br />
Siento desilusionaros, porque para mí, este es el punto flojo del libro. ¿Por qué? Intenta en poco menos de 100 páginas, explicarnos todo LINQ to Objects, SQL, XML, DataSet pero intenta hacerlo de forma muy bruta ya que intenta meterte ahí con calzador toda la teoría detrás de <b>LINQ</b> la cual no es fácil de digerir.<br />
Yo entiendo que en 100 páginas no se puede explicar todo LINQ, pero yo lo habría dejado en una explicación básica o directamente lo hubiese sacado del libro.<br />
Para aprender <b>LINQ</b> hay otro libro de esta misma casa que ya reseñaré más adelante.</p>
<p><b>Conclusión:</b><br />
En conclusión, este libro es la mejor manera para llegar a dominar lo que se dice TODO <b>C#</b>, eso sí, es aburridísimo como habréis podido notar de mi reseña… No deja de ser escupir features una tras otra sin cesar. Aun así, lo hace una forma magistral, fácil de entender y sobretodo fácil de digerir.</p>
<p>Sin más preámbulos:</p>
<p><b>Positivo:</b></p>
<ul>
<li>Nos hace ver lo que hacemos mal y cómo mejorarlo.</li>
<li>Explica todas las features del lenguaje en su versión 2 y 3.</li>
<li>Los ejemplos de código, aunque de juguete, son muy claros.</li>
<li>No deja nada sin explicar, tiene respuesta a todo.</li>
</ul>
<p><b>Negativo:</b></p>
<ul>
<li>La parte de LINQ, sobraba, muy difícil de asimilar.</li>
<li>Algunas partes muy concretas son duras y difíciles de entender (Lease expression trees).</li>
</ul>
<p>La nota será de <b>9.8</b>. Le habría dado más puntos si hubiese quitado la parte de LINQ, puesto que solo hace confundir, y ya lo hubiese rematado si hubiese encontrado una forma de explicar los ‘Expression trees’ de una forma entendible.<br />
Si os termináis de leer este libro, probablemente el próximo a la cola sería el de <b>Linq In Action</b>, ya que explica <b>LINQ</b> de forma magistral y hasta los ‘Expression trees’ los explica bien jeje.</p>
<p>Bueno, os dejo el enlace a la página oficial del libro:</p>
<p><a href="http://www.manning.com/skeet/">Link</a></p>
<p>Un saludo,<br />
Fox</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/resena-c-in-depth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WPF] Datos en tiempo de diseño (Design-time DataContext)</title>
		<link>http://blog.foxandxss.net/index.php/datos-en-tiempo-de-diseno-design-datacontext/</link>
		<comments>http://blog.foxandxss.net/index.php/datos-en-tiempo-de-diseno-design-datacontext/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 15:13:22 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Blend]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.foxandxss.net/?p=125</guid>
		<description><![CDATA[¡Hola!
Para seguir este artículo necesitaréis de Microsoft Expression Blend 3 o Visual Studio 2010 Beta 2. Además necesitaréis una copia del proyecto del artículo &#8220;Data Templates&#8220;.
Antes de explicaros qué significa exactamente eso de Datos en tiempo de diseño quiero que veais el problema en vuestras carnes y así buscarle una solución idónea.
Yo usaré Blend 3 [...]]]></description>
			<content:encoded><![CDATA[<p>¡Hola!</p>
<p>Para seguir este artículo necesitaréis de <b>Microsoft Expression Blend 3</b> o <b>Visual Studio 2010 Beta 2</b>. Además necesitaréis una copia del proyecto del artículo &#8220;<a href="http://www.foxandxss.net/index.php/2009/08/wpf-data-templates/">Data Templates</a>&#8220;.</p>
<p>Antes de explicaros qué significa exactamente eso de <i>Datos en tiempo de diseño</i> quiero que veais el problema en vuestras carnes y así buscarle una solución idónea.</p>
<p>Yo usaré <b>Blend 3</b> así que las imágenes y las instrucciones serán usando este soft, pero se pueden aplicar con Visual Studio 2010 sin ningún problema.</p>
<p>Imaginad esta situación:</p>
<p>Queréis modificar el <i>Data Template</i> que habíamos creado del ejemplo citado. No sé, el borde ese verde que tiene cada item no os gusta y queréis ir probando colores hasta encontrar uno que os guste más. Ningún problema, abres el proyecto con el <b>Blend 3</b> y&#8230;.<br />
<span id="more-125"></span><br />
<a href="http://www.foxandxss.net/CosasBlog/FakeDataContext/1.png"><img alt="Screenshot" src="http://www.foxandxss.net/CosasBlog/FakeDataContext/1.png" title="Imagen 1" class="alignnone" width="485" height="484" /></a></p>
<p>Vaya tela, nos sale una bonita ventana en blanco&#8230; ¿Por qué no sale el contenido? No nos sale porque ni Blend ni Visual studio ni nadie sabe qué ha de representar ahí, o mejor dicho, nosotros estamos <i>&#8216;bindeando&#8217;</i> ese contenido a una propiedad del DataContext, o sea del ViewModel. Blend no sabe nada sobre ese DataContext que hemos establecido en código, así que el no sabe que ha de mostrar ahi ni nada. Si bien sabe como dibujar el Data Template, no sabe qué <i>&#8216;Data&#8217;</i> tiene que reprentar ahi.</p>
<p>Entonces con <b>Blend 3</b> llegó una nueva cosita llamada <i>Datos en tiempo de diseño</i>, o lo que es lo mismo, ofrecerle unos datos <i>&#8216;de mentira&#8217;</i> a <b>Blend 3</b> a fin de que los use para dibujar los Data Template en la ventana.</p>
<p>¿Qué quiero decir con eso de ofrecerle unos datos de mentira? Fácil, el <i>ItemsControl</i> está asociado a una lista llamada <i>ListaPersonas</i>, pero dicha lista &#8216;viene&#8217; del <i>DataContext</i> y como ya os he dicho, el editor visual no puede mostrar nada que venga de ahi, por eso nos aparece la ventana en blanco, porque ignora el DataContext.</p>
<p>Aquí es donde entra el <i>Datos en tiempo de diseño</i> (Design-time Data). es digamos un <i>DataContext</i> especial sólo para diseñar, así podemos mostrar datos &#8216;Fake&#8217; y ver como quedaría sin ejecutar la aplicación ni nada. Por ejemplo:</p>
<p>Imaginad que estais haciendo una aplicación de Twitter. Cuando la aplicación se conecta a la red, descarga tus tweets, y crea una instancia de la clase <i>Tweet</i> por cada tweet que recoja. ¿Cómo diseñarías la ventana principal del programa? ¿Creas un no sé, <i>ItemsControl</i> y creas un DataTemplate para los Tweet? Es una idea, pero es un coñazo, tienes que crear un template, abrir el programa, conectarte a tu Twitter, que descargue tus Tweets y ver que&#8230; oh mierda, ese borde no moooola nada. Cierras la aplicación, modifica el borde y otra vez a probarlo. Si tienes que hacer eso 50 veces para dejar el estilo a tu gusto, mueres.</p>
<p>¿Qué hacer entonces? Creas una clase llamada&#8230; FakeTweets por ejemplo que herede de la clase que usa tu ventana de DataContext, ahí instancias la lista del datacontext, creas unos cuantos tweets de mentira y usas la técnica que explicaré a continuación <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Este ejemplo es algo muy común, porque donde dices Twitter, dices aplicación de msn y su ventana de contactos, etc.</p>
<p>Vamos a nuestra aplicación que ya está abierta en Blend, y añadimos lo siguiente dentro del <i>Tag</i> de la ventana&#8230;</p>
<pre class="brush: xml;">
xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
xmlns:local=&quot;clr-namespace:DataTemplates&quot;
mc:Ignorable=&quot;d&quot;
</pre>
<p>Con lo que quedaría así:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;DataTemplates.Window1&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
	xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
	xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
    xmlns:local=&quot;clr-namespace:DataTemplates&quot;
	mc:Ignorable=&quot;d&quot;
    Title=&quot;Data Templates&quot; Height=&quot;600&quot; Width=&quot;600&quot;
    Background=&quot;#f8fffb&quot;&gt;
</pre>
<p>Voy a detallar para qué sirve cada uno:</p>
<pre class="brush: xml;">
xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
xmlns:local=&quot;clr-namespace:DataTemplates&quot;
</pre>
<p>Los 3 son namespace como podeis ver, cada uno con una idea en mente.</p>
<p>El primero es el que añade todo el tema de <i>Datos en tiempo de diseño</i>.<br />
El tercero es para importar el namespace de nuestra aplicación (luego veremos por qué)<br />
El segundo va en conjunto con:</p>
<pre class="brush: xml;">
mc:Ignorable=&quot;d&quot;
</pre>
<p>El namespace &#8216;mc&#8217; que hemos importando antes nos sirve para usar el <i>Ignorable</i>. ¿Para qué sirve esto? Sirve para excluir todo lo que sea del namespace indicado a la hora de compilar. ¿Por qué ignoramos el namespace &#8216;d&#8217;? Porque lo que nos ofrece son cosas que nos facilitan la vida a la hora de diseñar la aplicación, pero que a la hora de ejecutarla ya no nos sirve. Así que la aplicación compilada no contendrá nada de lo que coloquemos de cara a ayudarnos a diseñar.</p>
<p>¿Y ahora qué? Ahora tenemos que cargar en el XAML la clase con los datos &#8216;fake&#8217; (como por ejemplo la clase con tweets de mentira), en nuestro caso nos basta con cargar el <i>Presenter</i> ya que trae datos de ejemplos que nos servirá para el caso.</p>
<p>Para esto podemos usar por ejemplo un <i>ObjectDataProvider</i>:</p>
<pre class="brush: xml;">
&lt;Window.Resources&gt;
	&lt;ObjectDataProvider ObjectType=&quot;{x:Type local:Presenter}&quot; x:Key=&quot;FakeVM&quot; /&gt;
&lt;/Window.Resources&gt;
</pre>
<p>Como ves, he cargado el Presenter (usando el namespace <i>local</i> que cargué antes) y le he dado el nombre de <i>FakeVM</i>.</p>
<p>Ya solo nos quedaría cargar dicho objeto dentro del <i>Data Context</i> en tiempo de diseño, el cual está en el namcespace &#8216;d&#8217;.</p>
<p>En nuestro ejemplo, se lo asignaremos al <i>ItemsControl</i> como era de esperar:</p>
<pre class="brush: xml;">
&lt;ItemsControl ItemsSource=&quot;{Binding ListaPersonas}&quot; d:DataContext=&quot;{StaticResource FakeVM}&quot;&gt;
</pre>
<blockquote><p>NOTA: El método que he descrito aquí, inclusive los namespaces de blend, sirve tanto para <b>Blend 3</b> como para <b>Visual Studio 2010</b> (Beta 2 en adelante)</p></blockquote>
<p>ahora, si vamos al modo diseño&#8230;</p>
<p><a href="http://www.foxandxss.net/CosasBlog/FakeDataContext/2.png"><img alt="Screenshot" src="http://www.foxandxss.net/CosasBlog/FakeDataContext/2.png" title="Imagen 1" class="alignnone" width="485" height="484" /></a></p>
<p>Ya se ve!! Pero dirás&#8230; ¿Y ahora qué? ¿Puedo modificar el template en modo diseño y en ver los resultados en tiempo real? Claro que sí!</p>
<p>En <b>Blend 3</b>, abajo a la izquierda nos aparecerá el arbol de objetos de nuestra aplicación:</p>
<div class="wp-caption alignnone" style="width: 293px"><a href="http://www.foxandxss.net/CosasBlog/FakeDataContext/3.png"><img alt="Screenshot" src="http://www.foxandxss.net/CosasBlog/FakeDataContext/3.png" width="283" height="158" /></a><p class="wp-caption-text">Screenshot</p></div>
<p>Ahi hacemos click derecho en ItemsControl y luego <i>Edit Aditional Templates -> Edit Generated Items (ItemTemplate) -> Edit Current</i>. Al hacer esto vemos como se señala el primer objeto del <i>ItemsControl</i> (ya que realmente editando uno, cambian todos).</p>
<p>Ya solo nos queda hacer los cambios pertinentes, por ejemplo cambiando el borde de cada objeto por uno con gradiente Negro <-> Blanco. Comprobareis con alegría que mientras moveis el cursor en la paleta de colores, el resultado se va viendo en tiempo real, y no necesitaréis ejecutar la aplicación con cada cambio.</p>
<p><a href="http://www.foxandxss.net/CosasBlog/FakeDataContext/4.png"><img alt="Screenshot" src="http://www.foxandxss.net/CosasBlog/FakeDataContext/4.png" title="Imagen 1" class="alignnone" width="485" height="484" /></a></p>
<p>Así que en resumen, teneis una manera de poder diseñar los <i>Data Templates</i> de forma visual usando datos &#8216;fake&#8217; y que no afectará para nada a la aplicación compilada.</p>
<p>Espero vuestros comentarios <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/datos-en-tiempo-de-diseno-design-datacontext/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nueva versión de Apunta Notas 2</title>
		<link>http://blog.foxandxss.net/index.php/nueva-version-de-apunta-notas-2/</link>
		<comments>http://blog.foxandxss.net/index.php/nueva-version-de-apunta-notas-2/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 21:27:35 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Mis Programas]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.foxandxss.org/blog/?p=109</guid>
		<description><![CDATA[Hola!
Siento no escribir tanto como me gustaría, pero estuve de exámenes hace poco, y ahora he empezado a trabajar.
Bueno, antes de dichos exámenes escribí una nueva versión del Apunta Notas y la anucio por aquí para que la probeis.
Dicha versión tiene:


Ahora al borrar una categoría te da la opción de borrar todas las notas asociadas [...]]]></description>
			<content:encoded><![CDATA[<p>Hola!</p>
<p>Siento no escribir tanto como me gustaría, pero estuve de exámenes hace poco, y ahora he empezado a trabajar.</p>
<p>Bueno, antes de dichos exámenes escribí una nueva versión del Apunta Notas y la anucio por aquí para que la probeis.</p>
<p>Dicha versión tiene:<br />
<span id="more-109"></span></p>
<ul>
<li>Ahora al borrar una categoría te da la opción de borrar todas las notas asociadas a ella.</li>
<li>Si decides no borrar dichas notas, se enviarán a una categoría oculta llamada &#8220;Papelera&#8221;.</li>
<li>Ahora al pulsar intro se añadirá la nota automaticamente (antes no me funcionaba por un pequeño bug que no veía)</li>
<li>Los rectangulos de los colores también son botones para seleccionar el color</li>
<li>Algun bug solucionado</li>
</ul>
<p>Quizá se me olvide algo, pero ahora no caigo, realmente metí muchas mejoras a lo largo de 2 dias de trabajo con el.</p>
<p>Los enlaces están donde siempre <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>A ver si este fin de semana puedo hacer algo más interesante.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/nueva-version-de-apunta-notas-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apunta notas 2</title>
		<link>http://blog.foxandxss.net/index.php/apunta-notas-2/</link>
		<comments>http://blog.foxandxss.net/index.php/apunta-notas-2/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 17:24:08 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Mis Programas]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.foxandxss.org/blog/?p=105</guid>
		<description><![CDATA[¿Os acordais del Apunta notas? Seguro que sí  
Pues aquí estoy orgulloso de presentaros la nueva versión de mi programa de notas. Como veréis a continuación, el cambio es significativo:


Como podéis ver, ahora soporta distintas categorías y estas, distintos colores.
No sólo eso, si no que además podeis ampliar el tamaño de las notas por [...]]]></description>
			<content:encoded><![CDATA[<p>¿Os acordais del <a href="http://blog.foxandxss.net/index.php/apunta-notas/">Apunta notas</a>? Seguro que sí <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pues aquí estoy orgulloso de presentaros la nueva versión de mi programa de notas. Como veréis a continuación, el cambio es significativo:</p>
<p><a href="http://www.foxandxss.net/misprogramas/apuntanotas2/CapturaPrincipal-post.png"><img class="alignnone" src="http://www.foxandxss.net/misprogramas/apuntanotas2/CapturaPrincipal-post.png" alt="" width="485" height="364" /></a></p>
<p><span id="more-105"></span></p>
<p>Como podéis ver, ahora soporta distintas categorías y estas, distintos colores.</p>
<p>No sólo eso, si no que además podeis ampliar el tamaño de las notas por si quereis verla desde lejos del monitor[1]:</p>
<p><a href="http://www.foxandxss.net/misprogramas/apuntanotas2/zoom-post.png"><img class="alignnone" src="http://www.foxandxss.net/misprogramas/apuntanotas2/zoom-post.png" alt="" width="485" height="364" /></a></p>
<p>También tiene un editor de categorías donde podrás modificar todos los apartados de éstas como podéis ver aquí:</p>
<p><a href="http://www.foxandxss.net/misprogramas/apuntanotas2/Categorias-post.png"><img class="alignnone" src="http://www.foxandxss.net/misprogramas/apuntanotas2/Categorias-post.png" alt="" width="485" height="541" /></a></p>
<p>Como veis, podeis cambiar el nombre, color de fondo, color de texto&#8230; y además podéis ver una vista prévia de la nota para ver como quedará.</p>
<p>Para más detalles y descarga podéis visitar la página de <a title="Apunta Notas 2" href="http://www.foxandxss.net/misprogramas/apuntanotas2/apuntanotas.php">Apunta Notas 2</a>.</p>
<p>[1]: Yo personalmente apunto las cosas que le quiero comentar a mi novia y cuando la llamo me tumbo en la cama, así que pongo las notas bien grandecitas y así las veo desde allí <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/apunta-notas-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[WPF] Data Templates</title>
		<link>http://blog.foxandxss.net/index.php/wpf-data-templates/</link>
		<comments>http://blog.foxandxss.net/index.php/wpf-data-templates/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 21:07:05 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.foxandxss.org/blog/?p=92</guid>
		<description><![CDATA[Hola buenas!
Estáis deseosos de aprender más maravillas de WPF, ¿verdad? Pues nada, aquí os traigo algo muy util que os podría venir bien para vuestros propios desarrollos.
Empezamos con la gran pregunta:

¿Qué son los Data Templates?
Imagina que tienes una clase llamada Persona, Animales, etc. y queréis representar instancias de dichas clases visualmente en vuestro programa, el [...]]]></description>
			<content:encoded><![CDATA[<p>Hola buenas!</p>
<p>Estáis deseosos de aprender más maravillas de <b>WPF</b>, ¿verdad? Pues nada, aquí os traigo algo muy util que os podría venir bien para vuestros propios desarrollos.</p>
<p>Empezamos con la gran pregunta:<br />
<span id="more-92"></span></p>
<h2>¿Qué son los Data Templates?</h2>
<p>Imagina que tienes una clase llamada Persona, Animales, etc. y queréis representar instancias de dichas clases visualmente en vuestro programa, el problema como ya sabes es que dichas clases no tienen ninguna representación visual, con lo cual el resultado de ligar una instancia (o una lista de instancias) a un control como por ejemplo un ItemsControl sería el de llamar al método ToString de la instancia lo que nos da un resultado pésimo.</p>
<p>¿Qué podemos al respecto? Pues lo que estabas pensando si, usar <b>Data Templates</b>.</p>
<h2>¡Al turrón!</h2>
<p>Creamos un nuevo proyecto llamado <b>Data Templates</b> y creamos una clase llamada <i>Personas</i>, dicha clase contendrá este código:</p>
<pre class="brush: csharp;">
public class Persona
{
    public string Nombre {get; set; }
    public string Direccion { get; set; }
    public string Telefono { get; set; }
    public int Edad { get; set; }
    public string Sexo { get; set; }
    public string UrlImagen { get; set; }
    public string Color { get; set; }

    public Persona(string nombre, string direccion, string telefono,
                    int edad, string sexo)
    {
        Nombre = nombre;
        Direccion = direccion;
        Telefono = telefono;
        Edad = edad;
        Sexo = sexo;

        if (Sexo.Equals(&quot;Hombre&quot;))
        {
            Color = &quot;#bcebf9&quot;;
            UrlImagen = &quot;Imagenes\\hombre.png&quot;;
        }
        else
        {
            Color = &quot;#f8c2cd&quot;;
            UrlImagen = &quot;Imagenes\\mujer.png&quot;;
        }
    }

    public override string ToString()
    {
        return string.Format(&quot;Hola me llamo {0}, vivo en {1}, mi telefono es {2}, tengo {3} años y soy {4}&quot;, Nombre, Direccion, Telefono, Edad, Sexo);
    }
}
</pre>
<p>Nada aquí que os vaya a sorprender, una clase Persona, que aunque bastante mejorable, va de sobra para nuestro ejemplo. Puntualizo un par de cosas:</p>
<p>Ignorad por ahora el tema de las imagenes y el color, eso se usará más adelante (también meteremos las imagenes más adelante en el proyecto)<br />
El método ToString solo es para ver como quedaría la cosa sin Data Templates y luego se borrará.</p>
<p>Ahora creamos una clase llamada <i>Presenter</i> y le añadimos el siguiente código:</p>
<pre class="brush: csharp;">
class Presenter
{
    private List&lt;Persona&gt; listaPersonas;

    public Presenter()
    {
        listaPersonas = new List&lt;Persona&gt;();

        listaPersonas.Add(new Persona(&quot;Jesus&quot;, &quot;Calle 13&quot;, &quot;132456789&quot;, 23, &quot;Hombre&quot;));
        listaPersonas.Add(new Persona(&quot;Rosi&quot;, &quot;Big street 15&quot;, &quot;987654321&quot;, 27, &quot;Mujer&quot;));
        listaPersonas.Add(new Persona(&quot;Álvaro&quot;, &quot;To lejos street&quot;, &quot;147258369&quot;, 24, &quot;Hombre&quot;));
    }

    public List&lt;Persona&gt; ListaPersonas
    {
        get { return listaPersonas; }
        set { listaPersonas = value; }
    }
}
</pre>
<p>Una clase normal y corriente, simplemente creamos una lista de personas y añadimos algunos ejemplos de personas.</p>
<p>Ahora abrimos el code-behind de la ventana (<i>Windows1.xaml</i>) y modificamos el constructor para que quede de esta manera:</p>
<pre class="brush: csharp;">
public Window1()
{
    InitializeComponent();
    DataContext = new Presenter();
}
</pre>
<p>Y ahora, abrimos la ventana en sí y colocamos este markup:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;DataTemplates.Window1&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
    Title=&quot;Data Templates&quot; Height=&quot;600&quot; Width=&quot;600&quot;&gt;
    &lt;ItemsControl ItemsSource=&quot;{Binding ListaPersonas}&quot;&gt;

    &lt;/ItemsControl&gt;
&lt;/Window&gt;
</pre>
<p>Aquí simplemente añadimos un ItemsControl vacío al que le ligamos la lista que hemos creado anteriormente.</p>
<p>Ahora ejecutamos la aplicación y vemos el resultado:</p>
<p><a href="http://www.foxandxss.net/CosasBlog/datatemplates/1.PNG"><img alt="" src="http://www.foxandxss.net/CosasBlog/datatemplates/1.PNG" class="alignnone" width="600" height="600" /></a></p>
<p>Como podeis ver, apesta, es lo más cutre &#8220;ever seen&#8221;, así que vamos a arreglarlo usando los Data Templates.</p>
<p>Antes que nada, me gustaría explicar una cosilla para que no os lieis tanto:</p>
<p>Hay 2 clases bases para los controles, por un lado tenemos la clase <b>ContentControl</b> de la cual heredarán aquellos controles que solo tienen una pieza de contenido, como <b>button</b>, <b>Label</b>, etc.<br />
Por otro lado tenemos la clase <b>ItemsControl</b> de la cual heredarán aquellos controles que muestran una colección de items, como <b>TreeView</b>, <b>ListBox</b>, etc.</p>
<p>Si con la funcionalidad básica que nos ofrecen dichas clases bases vamos bien, no tenemos por qué usar ninguna hija, y en este caso como habeis visto, hemos usado simplemente un ItemsControl pues es todo lo que necesitamos.</p>
<p>Bueno, al grano, si queremos usar los Data Templates, lo unico que debemos hacer es decirle al control, en este caso el ItemsControl, que vamos a definir el aspecto de cada item del control, ¿Cómo? Así:</p>
<pre class="brush: xml;">
&lt;ItemsControl ItemsSource=&quot;{Binding ListaPersonas}&quot;&gt;
    &lt;ItemsControl.ItemTemplate&gt;
		&lt;DataTemplate&gt;
			...
		&lt;/DataTemplate&gt;
	&lt;/ItemsControl.ItemTemplate&gt;
&lt;/ItemsControl&gt;
</pre>
<p>Ahí, donde están los puntos suspensivos pues añadimos todo el <b>xaml</b> necesario para lograr el aspecto que queramos. Recordad que estamos definiendo el aspecto de UN solo item y no de toda la colección a la vez, así que ahi escribimos como queremos que se vea cada item y ya se aplicará para todos los items de la lista.</p>
<p>Así que sabiendo esto, vamos a modificar nuestro ejemplo.</p>
<p>Para empezar, puedes borrar el ToString de la clase Personas que ya no nos vale, una vez hecho esto, creamos el directorio <i>Imagenes</i> dentro del proyecto y ahi metemos las dos imágenes que voy a adjuntar a continuación (boton derecho -> guardar como):</p>
<p>[Imagen hombre]</p>
<p>[Imagen mujer]</p>
<p>Ya lo único que nos queda es modificar el ItemsControl añadiendole el template de cómo queremos que se represente cada instancia de la clase.</p>
<p>El código de la ventana quedaría así:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;DataTemplates.Window1&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
    Title=&quot;Data Templates&quot; Height=&quot;600&quot; Width=&quot;600&quot;
    Background=&quot;#f8fffb&quot;&gt;
    &lt;ItemsControl ItemsSource=&quot;{Binding ListaPersonas}&quot;&gt;
        &lt;ItemsControl.ItemTemplate&gt;
            &lt;DataTemplate&gt;
                &lt;Border BorderBrush=&quot;#4f9d70&quot; BorderThickness=&quot;2&quot;
                        Margin=&quot;5&quot; Padding=&quot;2.5&quot;&gt;
                    &lt;Grid Background=&quot;{Binding Color}&quot;&gt;
                        &lt;Grid.ColumnDefinitions&gt;
                            &lt;ColumnDefinition Width=&quot;auto&quot; /&gt;
                            &lt;ColumnDefinition Width=&quot;auto&quot; /&gt;
                            &lt;ColumnDefinition Width=&quot;*&quot; /&gt;
                        &lt;/Grid.ColumnDefinitions&gt;
                        &lt;Grid.RowDefinitions&gt;
                            &lt;RowDefinition Height=&quot;auto&quot; /&gt;
                            &lt;RowDefinition Height=&quot;auto&quot; /&gt;
                            &lt;RowDefinition Height=&quot;auto&quot; /&gt;
                            &lt;RowDefinition Height=&quot;auto&quot; /&gt;
                        &lt;/Grid.RowDefinitions&gt;
                        &lt;Border BorderBrush=&quot;#4f9d70&quot;  BorderThickness=&quot;1&quot;
                                Margin=&quot;2.5&quot; Grid.RowSpan=&quot;4&quot;&gt;
                            &lt;Image Source=&quot;{Binding UrlImagen}&quot; /&gt;
                        &lt;/Border&gt;
                        &lt;TextBlock Text=&quot;Nombre: &quot; FontSize=&quot;20&quot; FontWeight=&quot;Bold&quot; Grid.Column=&quot;1&quot; /&gt;
                        &lt;TextBlock Text=&quot;{Binding Nombre}&quot; FontSize=&quot;20&quot; Grid.Column=&quot;2&quot; /&gt;

                        &lt;TextBlock Text=&quot;Dirección: &quot; FontSize=&quot;20&quot; FontWeight=&quot;Bold&quot; Grid.Column=&quot;1&quot; Grid.Row=&quot;1&quot; /&gt;
                        &lt;TextBlock Text=&quot;{Binding Direccion}&quot; FontSize=&quot;20&quot; Grid.Column=&quot;2&quot; Grid.Row=&quot;1&quot; /&gt;

                        &lt;TextBlock Text=&quot;Teléfono: &quot; FontSize=&quot;20&quot; FontWeight=&quot;Bold&quot; Grid.Column=&quot;1&quot; Grid.Row=&quot;2&quot; /&gt;
                        &lt;TextBlock Text=&quot;{Binding Telefono}&quot; FontSize=&quot;20&quot; Grid.Column=&quot;2&quot; Grid.Row=&quot;2&quot; /&gt;

                        &lt;TextBlock Text=&quot;Edad: &quot; FontSize=&quot;20&quot; FontWeight=&quot;Bold&quot; Grid.Column=&quot;1&quot; Grid.Row=&quot;3&quot; /&gt;
                        &lt;TextBlock Text=&quot;{Binding Edad}&quot; FontSize=&quot;20&quot; Grid.Column=&quot;2&quot; Grid.Row=&quot;3&quot; /&gt;
                    &lt;/Grid&gt;
                &lt;/Border&gt;
            &lt;/DataTemplate&gt;
        &lt;/ItemsControl.ItemTemplate&gt;
    &lt;/ItemsControl&gt;
&lt;/Window&gt;
</pre>
<p>Bueno, aunque os de miedo al principio, el código es bastante facilón.</p>
<p>Añadimos un borde y dentro pues un grid y dentro de dicho grid colocamos los controles para representar los datos.</p>
<p>Aquí muy importante decir, que el <b>DataContext</b> dentro del DataTemplate será la instancia del objeto con el que estamos tratando, así que por ejemplo:</p>
<pre class="brush: xml;">
&lt;TextBlock Text=&quot;{Binding Nombre}&quot; FontSize=&quot;20&quot; Grid.Column=&quot;2&quot; /&gt;
</pre>
<p>Aqui con <i>Nombre</i> no nos estamos refiriendo a una propiedad llamada Nombre dentro de Presenter (el DataContext de la ventana), si no a la propiedad Nombre de las instancias de Persona que tiene la lista.</p>
<p>Ahora estáis viendo el uso que le doy a la propiedad <i>Color</i> dentro de la clase Persona, lo uso para definir el color de fondo del item. Sé que no debería añadir esta propiedad dentro de la clase, pero lo hago con motivos ilustrativos simplemente.</p>
<p>Creo que aquí no hay más nada que requiera de una explicación, aunque si os dejaré una screenshot para aquellos que no estén escribiendo el ejemplo en sus ordenadores.</p>
<p><a href="http://www.foxandxss.net/CosasBlog/datatemplates/2.PNG"><img alt="" src="http://www.foxandxss.net/CosasBlog/datatemplates/2.PNG" class="alignnone" width="600" height="502" /></a>	</p>
<p>Bueno, creo que no se me olvida nada, ahora solo queda esperar vuestros comentarios para ver que os ha parecido el artículo.</p>
<p>Os adjunto el proyecto : <a href="http://www.foxandxss.net/CosasBlog/datatemplates/DataTemplates.rar">DataTemplates.rar</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/wpf-data-templates/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
