﻿<?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 &#187; MVP</title>
	<atom:link href="http://blog.foxandxss.net/index.php/tag/mvp/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>Thu, 12 Aug 2010 12:22:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<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>admin</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, [...]]]></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>Ejemplo MVP con WPF</title>
		<link>http://blog.foxandxss.net/index.php/ejemplo-mvp-con-wpf/</link>
		<comments>http://blog.foxandxss.net/index.php/ejemplo-mvp-con-wpf/#comments</comments>
		<pubDate>Thu, 21 May 2009 18:06:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[MVP]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.foxandxss.org/blog/?p=3</guid>
		<description><![CDATA[NOTA: Aunque el patrón MVP es perfectamente funcional y válido, el patrón MVVM es bastante más util a la hora de desarrollar aplicaciones WPF. Buenas, vamos a cumplir con lo prometido y voy a escribir un pequeño tutorial sobre el patrón &#8220;Model &#8211; View &#8211; Presenter (MVP)&#8221; usando C# y WPF. MVP, es un patrón [...]]]></description>
			<content:encoded><![CDATA[<p><strong>NOTA: Aunque el patrón MVP es perfectamente funcional y válido, el patrón <a href="http://blog.foxandxss.net/index.php/introduccion-a-mvvm-light-indice/">MVVM</a> es bastante más util a la hora de desarrollar aplicaciones WPF.</strong></p>
<p>Buenas, vamos a cumplir con lo prometido y voy a escribir un pequeño tutorial sobre el patrón &#8220;Model &#8211; View &#8211; Presenter (MVP)&#8221; usando C# y WPF.</p>
<p>MVP, es un patrón derivado del &#8220;Model &#8211; View &#8211; Controller (MVC)&#8221; y básicamente nos sirve para estructurar bien una aplicación y separar una parte de otras. Bueno, lo vemos mejor con un ejemplo.</p>
<p>Vamos a crear paso por paso un pequeño ejemplo de MVP usando un programa en WPF. Será muy básico para no liar mucho al personal y más a aquellos que nunca han visto nada de WPF.</p>
<p>Quiero puntualizar que el objetivo de éste artículo no es el de enseñar WPF, sino MVP y este se puede aprender sin entender el código WPF, pero aun asi daré unas explicaciones básicas.</p>
<p>Bueno, antes de empezar con el ejemplo, voy a explicar un poco el objetivo de cada parte del patrón y afianzaremos esos conocimientos con el ejemplo.<br />
<span id="more-425"></span></p>
<p>En el modelo, introduciremos logicamente, el modelo de la aplicación, o sea, la &#8220;lógica del negocio&#8221; y también todo el acceso a datos, ya sea a bases de datos, a ficheros, serialización, xml&#8230;<br />
Esta parte es fácil, aqui introducimos las tipicas clases: &#8220;Persona&#8221;, &#8220;Contacto&#8221;&#8230;, vamos, como ya he dicho, la &#8220;lógica del negocio&#8221;.</p>
<p>En la vista es donde irán los formularios, dialogos, ventanas (WPF), Controles de usuario (WPF), vamos todo lo que tiene una vista.<br />
La vista de la aplicación se usará para mostrar obviamente la vista y en el Code-Behind el poco código C# que escribiremos ahi será el justo justo para hacer cosas puntuales con los controles de la vista, por ejemplo añadir una pestaña a un &#8220;TabControl&#8221;. Todo lo demás, como por ejemplo tratar los datos que recojamos de la vista o manejar un evento, lo hará el presenter:</p>
<p>El presenter, cada vista tendrá asignado un presenter, el cual hace toda la &#8220;chicha&#8221; de la vista, o sea, meneja los eventos de la vista, trata los datos de la vista y bueno, básicamente es un intermediario entre el modelo y la vista.</p>
<p>No os preocupeis si no lo veis demasiado claro, ya que ahora vereis un ejemplo.</p>
<p>Para empezar, vamos al Visual Studio y creamos una nueva aplicación WPF, como nombre podemos darle &#8220;EjemploMVP&#8221; (super original).</p>
<p>Luego vamos a agregar una serie de carpetas al proyecto para estructurar bien la aplicación:</p>
<p>Model<br />
Views<br />
Presenters</p>
<p>A continuación borramos el Windows.xaml y agregamos una nueva ventana de WPF llamada &#8220;Shell.xaml&#8221; (es más comodo borrarla que renombrar cosas).</p>
<p><a href="http://www.foxandxss.net/CosasBlog/EjemploMVP/1.JPG"><img class="alignnone" src="http://www.foxandxss.net/CosasBlog/EjemploMVP/1.JPG" alt="" width="276" height="223" /></a></p>
<p>Ahora, abrimos el App.xaml y cambiamos el &#8220;StartupUri&#8221; para que quede así:</p>
<pre class="brush: xml;">
StartupUri=&quot;Shell.xaml&quot;
</pre>
<p>Básicamente, el &#8220;App.xaml&#8221; es el archivo principal de la aplicación y es el que abre la ventana principal, y lo que hemos hecho ha sido modificar el atributo &#8220;StartupUri&#8221; para que abra la nueva ventana que hemos creado.</p>
<p>Bueno, vamos a escribir el siguiente código en el &#8220;Shell.xaml&#8221;, vamos la interfaz de la ventana:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;EjemploMVP.Shell&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;Ejemplo MVP&quot; Height=&quot;480&quot; Width=&quot;640&quot;&gt;
    &lt;DockPanel&gt;
        &lt;StatusBar DockPanel.Dock=&quot;Bottom&quot;&gt;
            &lt;StatusBarItem&gt;
                &lt;TextBlock Text=&quot;Bienvenidos al ejemplo MVP&quot; /&gt;
            &lt;/StatusBarItem&gt;
        &lt;/StatusBar&gt;
        &lt;TabControl x:Name=&quot;tabs&quot; /&gt;
    &lt;/DockPanel&gt;
&lt;/Window&gt;
</pre>
<p>Bueno, he creado un layout del tipo &#8220;DockPanel&#8221; y dentro he metido una &#8220;StatusBar&#8221; en la parte de abajo y en la parte sobrante he metido un &#8220;TabControl&#8221;, el cual está vacio pues lo rellenaremos más tarde.</p>
<p>El &#8220;StatusBar&#8221; simplemente muestra un texto fijo, normalmente mostrará un texto dinamicamente según lo que ocurra en la aplicación, pero os marearia con temas avanzados de &#8220;Data Binding&#8221;.</p>
<p>Si ejecutas el programa verás lo siguiente:</p>
<p><a href="http://www.foxandxss.net/CosasBlog/EjemploMVP/2.JPG"><img class="alignnone" src="http://www.foxandxss.net/CosasBlog/EjemploMVP/2.JPG" alt="" width="641" height="483" /></a></p>
<p>Nada interesante por ahora <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<p>Ahora antes de nada, vamos a crear un presenter base del cual heredarán todos los demás presenters.</p>
<p>Así que cread una nueva clase en la carpeta &#8220;Presenters&#8221; llamada &#8220;BasePresenter&#8221;, aqui os pongo el código:</p>
<pre class="brush: csharp;">
namespace EjemploMVP.Presenters
{
    public class BasePresenter&lt;T&gt;
    {
        private readonly T _view;

        public BasePresenter(T view)
        {
            _view = view;
        }

        public T View
        {
            get { return _view; }
        }
    }
}
</pre>
<p>Nada nuevo en esta clase. Simplemente hemos creado una clase base para los presenters el cual es genérica y recibirá una vista, o sea, la vista asignada a cada presenter.</p>
<p>Lo próximo que vamos a hacer es crear el presenter asignado a esta vista (recordar que toda vista tiene asignado un presenter).</p>
<p>Asi que agregamos una nueva clase a la carpeta &#8220;Presenters&#8221; llamada &#8220;ApplicationPresenter&#8221;. Normalmente se les suele poner el nombre en plan &#8220;NombredelavistaPresenter&#8221;, en este caso no lo hacemos pues este presenter es el que maneja toda la aplicación en si, pues al ser el presenter de la ventana principal, está destinado a menajar la aplicación en si.</p>
<p>Aqui vemos el código:</p>
<pre class="brush: csharp;">
namespace EjemploMVP.Presenters
{
    public class ApplicationPresenter : BasePresenter&lt;Shell&gt;
    {
        public ApplicationPresenter(Shell view) : base(view) { }
    }
}
</pre>
<p>Por ahora no hace nada la clase, simplemente recibe una instancia del tipo Shell (La vista a la cual está asignado el presenter) y se la pasa al constructor de la clase padre para asignarla a la propiedad &#8220;View&#8221;</p>
<p>Lo siguiente que vamos a hacer es relacionar nuestro presenter a su vista correspondiente. En WPF esto se hace usando la propiedad &#8220;DataContext&#8221; de la Ventana, esto lo que hace es darle un contexto a la ventana para usarlo en los &#8220;DataBinding&#8221; entre otras cosas.</p>
<p>Así que modificamos el constructor del Code-Behind de &#8220;Shell.xaml&#8221; y lo dejamos así:</p>
<pre class="brush: csharp;">
public Shell()
{
    InitializeComponent();
    DataContext = new ApplicationPresenter(this);
}
</pre>
<p>No os olvideis de importar el namespace EjemploMVP.Presenters en la aplicación:</p>
<pre class="brush: csharp;">
using EjemploMVP.Presenters;
</pre>
<p>Ahora que tenemos relacionado la vista y el presenter, es hora de agregarle algo de chicha al programa.</p>
<p>Vamos a crear un modelo, no sé, vamos a hablar de personas, lo típico vaya <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Insertad en la carpeta &#8220;Model&#8221; una clase llamada Persona, y le metemos este código:</p>
<pre class="brush: csharp;">
namespace EjemploMVP.Model
{
    public class Persona
    {
        public string Nombre { get; set; }
        public string Edad { get; set; }
        public string Sexo { get; set; }

        public override string ToString()
        {
            return string.Format(&quot;Hola me llamo {0}, soy {1} y tengo {2} años&quot;, Nombre, Sexo, Edad);
        }
    }
}
</pre>
<p>Una clase básica, 3 Propiedades y sobreescribimos el ToString para que imprima un mensajito chulo.</p>
<p>Ahora que tenemos el modelo, vamos a crear una vista que trabaje con dicho modelo, así que vamos a crear una UserControl (Control de Usuario) en la carpeta Views llamada &#8220;PersonaView&#8221;, el código será el siguiente:</p>
<pre class="brush: xml;">
&lt;UserControl x:Class=&quot;EjemploMVP.Views.PersonaView&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;&gt;
    &lt;DockPanel&gt;
        &lt;Grid DockPanel.Dock=&quot;Top&quot;&gt;
            &lt;Grid.ColumnDefinitions&gt;
                &lt;ColumnDefinition Width=&quot;*&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;Label Content=&quot;_Nombre:&quot;
                   Target=&quot;{Binding ElementName=Pnombre}&quot; /&gt;
            &lt;TextBox x:Name=&quot;Pnombre&quot;
                     Grid.Row=&quot;1&quot;
                     Grid.ColumnSpan=&quot;2&quot;
                     Text=&quot;{Binding Persona.Nombre}&quot; /&gt;

            &lt;Label Content=&quot;_Edad:&quot;
                   Grid.Row=&quot;2&quot;
                   Target=&quot;{Binding ElementName=Pedad}&quot; /&gt;
            &lt;TextBox x:Name=&quot;Pedad&quot;
                     Grid.Row=&quot;3&quot;
                     Text=&quot;{Binding Persona.Edad}&quot; /&gt;

            &lt;Label Content=&quot;_Sexo:&quot;
                   Grid.Row=&quot;2&quot;
                   Grid.Column=&quot;1&quot;
                   Target=&quot;{Binding ElementName=Psexo}&quot; /&gt;
            &lt;TextBox x:Name=&quot;Psexo&quot;
                     Grid.Row=&quot;3&quot;
                     Grid.Column=&quot;1&quot;
                     Text=&quot;{Binding Persona.Sexo}&quot; /&gt;
        &lt;/Grid&gt;
        &lt;StackPanel Orientation=&quot;Horizontal&quot; HorizontalAlignment=&quot;Right&quot;
                    VerticalAlignment=&quot;Top&quot; DockPanel.Dock=&quot;Bottom&quot;&gt;
            &lt;Button Content=&quot;Aceptar&quot;  Click=&quot;Button_Click&quot;/&gt;
        &lt;/StackPanel&gt;
    &lt;/DockPanel&gt;
&lt;/UserControl&gt;
</pre>
<p>Como podeis ver, es un código bastante más grande. Básicamente creamos una tabla donde introducimos los labels y las cajas y debajo ponemos un botón. Lo importante que hay que ver aquí es la sintaxis del tipo:</p>
<pre class="brush: xml;">
Text=&quot;{Binding Persona.Sexo}&quot;
</pre>
<p>Aqui hacemos uso de una tecnica llamada &#8220;Data Binding&#8221;, y estamos ligando la Propiedad &#8220;Sexo&#8221; de la propiedad &#8220;Persona&#8221; (Que es una instancia de la clase Persona), así directamente lo que escribamos en la caja, se asignará a la instancia de la clase. Una maravilla.</p>
<p>Bueno, ahora que tenemos la vista, vamos a agregar su presenter, ¿no? <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Asi que nada, nueva clase en Presenters llamada &#8220;PersonaPresenter&#8221;, le metemos el siguiente código:</p>
<pre class="brush: csharp;">
using EjemploMVP.Views;
using EjemploMVP.Model;

namespace EjemploMVP.Presenters
{
    public class PersonaPresenter : BasePresenter&lt;PersonaView&gt;
    {
        private readonly ApplicationPresenter _applicationPresenter;
        private Persona _persona;

        public PersonaPresenter(ApplicationPresenter presenter, PersonaView view)
            : base(view)
        {
            _applicationPresenter = presenter;
            _persona = new Persona();
        }

        public Persona Persona
        {
            get { return _persona; }
        }
    }
}
</pre>
<p>Bueno, aquí como en el ApplicationPresenter, heredamos del BasePresenter y le asigamos el tipo de Vista al que está relacionado el presenter.</p>
<p>Éste presenter recibirá la instancia del ApplicationPresenter (para que esta Vista/Presenter pueda relacionarse con la aplicación principal) y la vista que vamos a usar con el presenter (la que tenemos relacionada con el)</p>
<p>Creamos una propiedad del tipo Persona que será la que nuestra Vista use en sus &#8220;Data Bindings&#8221; (lo que dije más arriba). Así que cada vez que insertemos algo en las cajas de la vista, se rellenará esta instancia de aquí.</p>
<p>Ya que tenemos una vista con su presenter, lo que tenemos que hacer es añadir esta vista a la ventana principal, para ello, necesitamos añadir algún método más a lo que ya tenemos creado.</p>
<p>Para empezar, añadimos un método que nos permitirá añadir nuestas pestañas a nuestro &#8220;TabControl&#8221;, así que nos vamos al &#8220;Shell.xaml.cs&#8221; (el Code-Behind de la ventana principal) y le añadimos el siguiente método:</p>
<pre class="brush: csharp;">
public void AddTab&lt;T&gt;(BasePresenter&lt;T&gt; presenter, string header)
{
    TabItem tab = new TabItem();
    tab.Header = header;
    tab.DataContext = presenter;
    tab.Content = presenter.View;
    tabs.Items.Insert(0, tab);
    tab.Focus();
}
</pre>
<p>Éste método ya se mete más en el tema WPF, pero explicaré que es lo que hace.</p>
<p>Recibe un presenter (que es un presenter asignado a una vista que queremos agregar como pestaña), y una cadena que contendrá el titulo de esa pestaña.</p>
<p>Así que creamos un nuevo &#8220;TabItem&#8221; y le asignamos una serie de propiedades. Lo interesante de ahi es ver como el DataContext de la pestaña será el presenter, Así la pestaña (que es nuestra vista, o sea, &#8220;PersonaView&#8221;) tendrá a &#8220;PersonaPresenter&#8221; como su DataContext ya que si no recordais mal, cada Vista ha de tener como DataContext su presenter (Esto es tema WPF). Si no hicieramos esto, la pestaña tendría a &#8220;ApplicationPresenter&#8221; como DataContext heredandolo de la ventana donde está incrustrada esa vista.</p>
<p>También le decimos que el contenido de la pestña sea la vista asignada al presenter.</p>
<p>Luego la añadimos y le damos el foco.</p>
<p>La razón por la cual este método está aqui y no en su presenter, es porque maneja directamente la vista y eso si es trabajo de la vista. Sin embargo, el instanciar los presenters para asignarlos a las pestañas si es cosa del presenter, así que vamos a añadir el siguiente método al &#8220;ApplicationPresenter&#8221;:</p>
<pre class="brush: csharp;">
public void RellenarTabs()
{
    View.AddTab(new PersonaPresenter(this, new PersonaView()), &quot;Persona&quot;);
}
</pre>
<p>Ahora, para que éste método se ejecute al arrancar la aplicacion&#8230;. Sí, has pensado bien, podemos usar el evento Loaded de la ventana para llamar a este metodo, así que vamos a ello:</p>
<p>Abrimos el Shell.xaml y en el objeto Window añadimos la siguiente linea para que quede así:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;EjemploMVP.Shell&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;Ejemplo MVP&quot; Height=&quot;480&quot; Width=&quot;640&quot;
    Loaded=&quot;Window_Loaded&quot;&gt;
</pre>
<p>Si ahora pinchais en donde pone Window_Loaded, la dais al boton derecho y luego a &#8220;navegar al controlador de eventos&#8221;, os creará el método automáticamente si no lo hizo ya.</p>
<p>así que abrimos el Shell.xaml.cs y añadimos la siguiente propiedad y rellenamos el evento que acabamos de crear:</p>
<pre class="brush: csharp;">
public ApplicationPresenter Presenter
{
    get { return DataContext as ApplicationPresenter; }
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    Presenter.RellenarTabs();
}
</pre>
<p>Bueno, simplemente hemos creado una propiedad del tipo ApplicationPresenter que nos va a devolver el presenter de la ventana, así en el evento &#8220;Loaded&#8221; de la ventana, delegamos la operación al Presenter.</p>
<p>Ahora, si ejecutais la aplicación, vereis que ya muestra nuesta pestaña <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  (Si os da error de que el método del boton de PersonaView no está definido, cread el método, que esto lo crea solo cuando quiere <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</p>
<p>Pero oh, no hace nada, bueno, vamos a añadir un codigo &#8220;de pega&#8221; para que haga algo.</p>
<p>Vamos a crear una clase estática en Model llamada imprimidor, para imprimir la cadena, ea.</p>
<p>Le metemos el siguiente código:</p>
<pre class="brush: csharp;">
using System;
using System.Windows;

namespace EjemploMVP.Model
{
    public static class Imprimidor
    {
        public static void Imprimir(string cadena)
        {
            MessageBox.Show(cadena);
        }
    }
}
</pre>
<p>Nada fuera de otro mundo, simplemente lo imprime en una caja.</p>
<p>Ahora añadimos un método en ApplicationPresenter para usar el imprimidor:</p>
<pre class="brush: csharp;">
public void Imprimir(string cadena)
{
    Imprimidor.Imprimir(cadena);
}
</pre>
<p>Aquí simplemente delegamos la acción de imprimir a la nueva clase. La razón por la cual el metodo Imprimir está en el ApplicationPresenter, es porque como ya dije, es el que maneja el cotarro aquí y es el que hace todo. Para que las vistas usen este método para imprimir sus mensajes, tenemos que ir delegando la acción hasta llegar al ApplicationPresenter, como veremos ahora:</p>
<p>Abrimos el PersonaView.xaml.cs y rellenamos el método del botón además de añadir una propiedad el Presenter de esa vista:</p>
<pre class="brush: csharp;">
public PersonaPresenter Presenter
{
    get { return DataContext as PersonaPresenter; }
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    Presenter.Imprimir();
}
</pre>
<p>Nada, como hicimos con el Code-Behind de la ventana principal, delegamos la acción a nuestro presenter.</p>
<p>Así que vamos al presenter a crear dicho método:</p>
<pre class="brush: csharp;">
public void Imprimir()
{
    _applicationPresenter.Imprimir(Persona.ToString());
}
</pre>
<p>Nada, aqui tambien delegamos la acción, aunque esta vez le pasamos la cadena que queremos imprimir.</p>
<p>Ahora, si ejecutamos la aplicación y probamos algo&#8230; saldrá algo como esto:</p>
<p><a href="http://www.foxandxss.net/CosasBlog/EjemploMVP/3.JPG"><img class="alignnone" src="http://www.foxandxss.net/CosasBlog/EjemploMVP/3.JPG" alt="" width="640" height="482" /></a></p>
<p>Nada más. Si os fijais, añadir nuevas pestañas a la vista es ahora muy fácil, basta con crear nuestro modelo, no sé, de coches, superheroes&#8230; Crear la vista para introducir los datos y el presenter para que haga el trabajo que la vista requiere. Por ultimos &#8220;enchufais&#8221; la vista a la ventana a través del presenter y tachán!. Si quereis como práctica podeis agregar una vista más.</p>
<p>En resumen, habeis visto como crear una básica aplicación usando MVP. Nuestras vistas tienen siempre asignadas un presenter (Algunas vistas no requieren trabajo, asi que su presenter será del padre), y dicho presenter es el que hace el trabajo sucio y en concreto, el presenter de la ventana principal será el más trabaje.</p>
<p>Podeis bajaros de aqui el proyecto: <a href="http://www.foxandxss.net/CosasBlog/EjemploMVP/EjemploMVP.rar">Enlace</a></p>
<p>Espero que os haya gustado, por favor dejad algún comentario&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/ejemplo-mvp-con-wpf/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
