Archivo para septiembre, 2008

Usando Databinding y ValueConverter

Posted in BlackPoint, Blend, Tutorial, WPF on septiembre 14, 2008 by César Intriago

En una de las tareas en el desarrollo de BlackPoint relacionada con enlace de datos tuve que escribir un ValueConverter personalizado para analizar una cadena de texto y en función del contenido retornar si un control debería o no ser visible. En la práctica este es el escenario:

Tengo un textblock que va a mostrar el título de una diapositiva, este textblock está enlazado (databinding) a la propiedad Name de un objeto. El contexto de los datos es una lista de valores, de tal forma que cada vez que seleccione un ítem distinto, el texto se actualiza. Este es el código XAML normalmente usado para databinding (generado por Blend):

 

<TextBlock Text=”{Binding Path=Name, Mode=Default}”  DataContext=”{Binding Path=Parts, Mode=Default}” />

 

Revisando el atributo Text, podemos observar que está enlazado a la propiedad Name de un objeto llamada Parts, este objeto Parts es del tipo List<Parts>. En un ListBox tengo listados todos los Parts, de tal forma que al seleccionar uno, se actualiza automáticamente el texto del TextBlock. El problema con este código es que cuando un Part no tenga un nombre (es decir Name == “”) el comportamiento del binding hace que muestre el nombre último ítem seleccionado que sí tenía un nombre, la verdad no se por qué funciona de esta forma o cómo es el manejo de las cadena vacías en este caso. Este era un buen escenario para usar un ValueConverter.

Un ValueConverter permite transformar un valor a otro, antes de que se realice el binding con el control. Por ejemplo, puedo crear un ValueConverter y usarlo para analizar la propiedad Name, si es vacía que ponga otro texto y sea ese el que se muestre en el TextBlock.

Crear un ValueConverter es sencillo, simplemente creamos una clase que implemente la interfaz IValueConverter:

public class TextConverter : IValueConverter
    {
        const string DEFAULT_TEXT = “…”;
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                String text = value.ToString();

                if (!String.IsNullOrEmpty(text))
                    return text;
                return DEFAULT_TEXT;
            }

            return DEFAULT_TEXT;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value.ToString();
        }

        #endregion
    }

Como se ve en el código anterior, si la propiedad es nula o vacía,se devuelve la cadena “…”, caso contrario se devuelve la misma propiedad.

El binding para usar el TextConverter se puede realizar desde Blend, sin tener que escribir XAML, si desean hacerlo desde Blend sigan estos pasos:

  1. Seleccionen el TextBlock.
  2. Busquen la propiedad Text y seleccionen DataBinding
  3. En la parte inferior de la ventana de enlace de datos, seleccionen ValueConverter.
  4. De la ventana “Add Value Converter” seleccionen el TextConverter y presionen OK, Blend busca y presenta automáticamente las objetos del CLR que implementan la interfaz IValueConverter.

ValueConverter

De esa forma se realiza el databinding aplicando algún ValueConverter.

BONUS: Le dejo un captura de pantalla de BlackPoint:

BlackPoint08

Anuncios

BlackPoint – Framework

Posted in BlackPoint, Patrones de Diseño on septiembre 4, 2008 by César Intriago

BlackPoint Framework es un componente que permite desarrollar los adaptadores de contenido (módulos encargados de extraer la información de los archivos), los repositorios (módulos para persistir los datos de la aplicación), y para implementar la aplicación cliente de BlackPoint.

Precisamente este framework es el que estoy usando para desarrollador el adaptador para PowerPoint 2007, el repositorio en archivos XML y la aplicación cliente en Windows Presentation Foundation. Básicamente este framework provee:

  • Las interfaces con las que se deben programar para BlackPoint y los objetos que se pasan entre los distintos componentes de la aplicación.
  • Métodos de extensión para facilitar tareas de convertir objetos a XML y viceversa.
  • Implementaciones básicas de las interfaces para contenido.
  • Eventos para notificar al cliente sobre sucesos de los adaptadores.
  • Otros miembros de que ayudan en la implementación de los componentes.

El siguiente es un diagrama de clases del framework de BlackPoint:

BlackPoint.Framework

  • IOpenXmlPart: Representa una parte del contenido de un archivo, por ejemplo cada una de las diapositivas de una presentación se representan como una parte.
  • IOpenXmlContent:Representa un contenido en particular, por ejemplo todo una presentación en PowerPoint 2007.
  • FrameworkOpenXmlContent y FrameworkOpenXmlPart: Implementaciones concretas de las interfaces IOpenXmlContent e IOpenXmlPart, estas implementaciones se ofrecen en el framework para evitar que los desarrolladores tengan que hacerlo en sus propios adaptadores, si lo desean pueden crear también sus propias implementaciones.
  • ILibraryRepository: Cualquier repositorio de datos que se desee usar para BlackPoint debe implementar esta interfaz.Un repositorio se encarga de almacenar los datos de los contenidos, puede ser en archivos XML, bases de datos, etc.
  • IOpenXmlAdapter: Los adaptadores son los encargados de leer el contenido de los archivos y extraer sus datos, la información es cargada dentro de un objeto que implemente la interfaz IOpenXmlContent. Por ejemplo el adaptador de PowerPoint 2007 lee un paquete con extensión “.pptx” y extrae la información de Título, Autor, Descripción, Palabras claves, diapositivas y una vista previa de cada una.
  • IFileType: Permite identificar los archivos soportados por cada adaptador. Por ejemplo el adaptador para PowerPoint 2007 se usa para archivos con extensión “.pptx”.
  • ContentImportedDelegate y ContentEventArgs: Evento personalizado para notificar cuando a los subsciptores cuando un adaptador ha terminado de importar un contenido, se pasa como argumento el contenido importado.
  • Utils.GetImageStream: Lee una imagen de una Uri y la convierte a un mapa de bits en memoria.
  • Extension ToOpenXmlContent: Convierte un objeto XmlNode a IOpenXmlContent.
  • Extension ToXmlElement: Convierte un objeto IOpenXmlContent a un objeto XmlElement.
  • BlackPointSettings: Provee configuraciones generales del framework, como los nombres de los elementos para archivos XML.

Como se podrán dar cuenta, un principio básico que intento seguir es el de programar contra interfaces y no contra objetos en concreto, de esta forma se facilita la extensión del código y el soporte para nuevos módulos personalizados o especializados.

En entradas futuras publicaré mas diagramas de clases usados en BlackPoint. Como ven se han realizados algunos cambios desde la primera versión de este diagrama.

Visual Studio 2008 – Hot !

Posted in Opinion on septiembre 2, 2008 by César Intriago

En esta entrada de Ecuador Developers se habla sobre que tan “sexy” o “hot” se ve Visual Studio con distintas combinaciones de colores del editor de código, personalmente prefiero una simple variación del estilo original, un color de fondo gris claro para facilitar la lectura y evitar un poco el cansancio de los ojos al leer, aquí una captura:

VS2008

Pero realmente lo que hace que mi Visual Studio 2008 sea “hot” y “sexy” (a riesgo de caer en el estereotipo de las películas) es esto:

VS2008_on_mac

Que corra en Mac OS X Leopard 🙂

Desarrollo de Software en Mac

Posted in Apple, Opinion on septiembre 1, 2008 by César Intriago

Siendo un desarrollador de .Net y usuario de Mac, me entró la curiosidad de probar la última versión de XCode que es el entorno de desarrollo creado por Apple para desarrollar aplicaciones para Leopard, Web, iPod y iPhone. Me lo bajé gratuitamente de www.apple.com (1.25 GB) y lo instalé, leí rápidamente un PDF tutorial y ya pude hacer mi primera aplicación, comparado con la última vez que probé XCode realmente es bueno ver como se han mejorado muchas cosas y se han agregado unas nuevas, a continuación voy a mostrar unas capturas de pantallas de XCode y de una aplicación de ejemplo sencilla usando una tecnología de Apple llamada CoreData la cual permite crear de forma sencilla repositorios de datos (Viene a ser algo como un SQL Server para aplicaciones) y que permite mapear clases (similar a Linq??). Al mas puro estilo de Visual Studio, esta aplicación se crea sin escribir una línea de código. Aquí las capturas:

Pantalla de bienvenida de XCode y diferentes pestañas:

Imagen 1 Imagen 2
Imagen 3 Imagen 4

Creando un nuevo proyecto:

Imagen 5

El entorno de desarrollo:

Imagen 6

Creando una entidad en CoreData:

Imagen 7

Interface Builder para desarrollar la IU, CoreData tiene un asistente el cual usé en este caso:

Imagen 8

Guardando la IU, esto es nuevo para mí, soporta Obj-C, Python !! y Ruby !!

Imagen 9

La aplicación en ejecución y funcionando (0 líneas de código escritas por mi):

Imagen 10

Esas son todas las capturas de este “photo-post” espero que las encuentren interesantes, pues Visual Studio ya encontró con quién compartir tiempo respecto al desarrollo :). Voy a seguir probando a ver si logro hacer algo interesante y luego probaré hacer algo para el iPhone.