2 Ventanas usando WPF de forma Desacoplada


Tiempo atrás vimos en un artículo la forma de comunicar dos ventanas WPF usando eventos, esta vez vamos a usar una interfaz. MSDN Library define de esta manera las interfaces.

Las interfaces describen un grupo de funcionalidades relacionadas que pueden pertenecer a cualquier elemento class o struct. Define una interfaz utilizando la palabra clave de interfaz (interface).

Comencemos porque son bastantes cosas las que veremos. Primero miremos la interfaz.

public interface Enlace
{
    void agregar ( string firstName, string lastName );
}

Bastante sencilla no? Ahora miremos su implementación en la ventana Padre.

public void agregar ( string firstName, string lastName )
        {
            NameList nl = Resources["NameListData"] as NameList;
            nl.Add ( new PersonName ( firstName, lastName ) );
        }


Se estarán preguntando que es eso de NameList y NameListData. Esto se debe a que esta vez usaremos una ObservableCollection<>. MSDN Library nos comenta acerca de esto:

Representa una colección de datos dinámicos que proporciona notificaciones cuando se agregan o se quitan elementos o cuando se actualiza toda la lista.

Gracias a esta ObservableCollection nosotros no le diremos al programa cuando debe agregar un elemento a la UI sino que el mismo la actualizará. Ahora miremos nuestra entidad como esta conformada.

    public class NameList : ObservableCollection
    {
        public NameList ()
        {
            new ObservableCollection ();
        }
    }

    public class PersonName
    {
        private string firstName;
        private string lastName;

        public PersonName ( string first, string last )
        {
            this.firstName = first;
            this.lastName = last;
        }

        public string FirstName
        {
            get { return firstName; }
            set { firstName = value; }
        }

        public string LastName
        {
            get { return lastName; }
            set { lastName = value; }
        }
    }

Como vemos tenemos una clase llamada personName y una clase llamada NameList que hereda de la clase ObservableCollection y tiene como tipo de datos nuestra clase personName.

Veamos ahora el code-behind de la ventana padre y la ventana hija.

Ventana Padre

private void Agregar_Click ( object sender, RoutedEventArgs e )
{
    AgregarUsuario ag = new AgregarUsuario ();
    ag.Owner = this;
    ag.Show ();
}

Es bastante sencillo el código así que no voy a entrar en detalle.

Ventana Hija

private void Boton_Agregar_Click ( object sender, RoutedEventArgs e )
        {
            //Validamos que haya ingresado al menos alguno de los dos campos (nombre, apellido).
            if ( Nombre.Text != string.Empty || Apellido.Text != string.Empty )
            {
                Enlace miEnlace = this.Owner as Enlace;
                if ( miEnlace != null )
                {
                    miEnlace.agregar ( Nombre.Text.ToString (), Apellido.Text.ToString () );
                }

                //Reinicializamos los valores de los textBox
                Nombre.Text = string.Empty;
                Apellido.Text = string.Empty;
            }
        }

Aquí si está lo interesante. Declaramos un objeto de tipo Enlace y le asignamos la ventana definida como padre siendo este casteado al tipo de la interfaz, luego simplemente apuntamos al miembro y pasamos el valor.

Pero esto no es todo… veamos la nueva cara que tiene nuestro XAML de la ventana padre.

<Window x:Class="VentanasWPF2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:c="clr-namespace:VentanasWPF2"
        Title="Ventana Padre" Height="350" Width="525">
    <Window.Resources>
        <c:NameList x:Key="NameListData"/>

        <DataTemplate x:Key="NameItemTemplate">
            <StackPanel>
                <TextBlock Text="{Binding Path=FirstName}" />
                <TextBlock Text="{Binding Path=LastName}"/>
            </StackPanel>
        </DataTemplate>
        
    </Window.Resources>
    
    <Grid Name="Grid">
        
        <ListBox Width="200" Name="Lista"
         ItemsSource="{Binding Source={StaticResource NameListData}}"
         ItemTemplate="{StaticResource NameItemTemplate}"
         IsSynchronizedWithCurrentItem="True"/>
        
        <Button Width="100" Height="30" HorizontalAlignment="Left" 
                Margin="30,0,0,0" Content="Agregar" Name="Agregar"
                Click="Agregar_Click"/>
    </Grid>
</Window>

Que cosas son nuevas:

  1. xmlns:c=”clr-namespace:VentanasWPF2″
  2. <c:NameList x:Key=”NameListData”/>
  3. ItemsSource=”{Binding Source={StaticResource NameListData}}”
  4. ItemTemplate=”{StaticResource NameItemTemplate}”

Con este artículo voy a comenzar una serie de artículos con respecto a la grandiosa propiedad de WPF conocida como Binding.

Les dejo el archivo VentanasWPF2.zip y como siempre les recuerdo cambiar el formato de odt a zip.

Anuncios

4 Respuestas a “2 Ventanas usando WPF de forma Desacoplada

  1. Hola!
    Lo primeor gracias pr el aporte, me ha resultado de gran interés. Tengo una duda de como aplicarlo a un posible escenario:
    Cuando la ventana padre es por ejemplo un textbox con un proveedor y en la ventana hija se abre un datagrid con una lista de los proveedores. Si se hace usando entities (las que crea el provio VS a partir de la BD), como se definiría esa interfaz de forma que pueda valer no solo para los proveedore sino también para otros campos como clientes, articulos, etc.?

  2. “2 Ventanas usando WPF de forma Desacoplada | Experiencias .

    NET” ended up being a good article and thus I really was extremely satisfied to read the blog.
    Thanks for your time,Elliott

  3. I like the helpful information you provide in your articles.
    I will bookmark your weblog and check again here regularly.
    I’m quite sure I’ll learn plenty of new stuff right
    here! Best of luck for the next!

  4. My brother suggested I might like this website. He was totally right.
    This post truly made my day. You cann’t imagine
    simply how much time I had spent for this info! Thanks!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s