La Liga Silverlight para WP7

Un pequeño vistazo a lo que será la aplicación de La Liga Silverlight para Windows Phone 7. Aún le faltan varias cosas, pero la idea es mas o menos la que se muestra en el video.

Hasta ahora he utilizado MVVM light toolkit, NuGet, Ninject, RestSharp y PhoneyTools. Una vez que esté terminada vendrá el detrás de las cámaras, es decir, una serie de posts de como se realizó la aplicación de principio a fin.

Video también disponible en YouTube.

DataGrid, ColumnSeries y un toque de MVVM

Ejemplpo de Datagrid

Recibí una pregunta pregunta en un post que había escrito previamente. La pregunta era como se puede cambiar una gráfica a la par con los datos de un DataGrid. La respuesta es ¡Con DataBinding!

Muchas gracias.

Ok ok, la explicación larga. Primero vamos a hacer un modelo para datos de prueba:

using System.ComponentModel;

namespace SilverlightApplication3
{
    public class SampleData : INotifyPropertyChanged
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            { 
                _name = value;
                NotifyPropertyChanged("Name");
            }
        }

        private double _value;
        public double Value
        {
            get { return _value; }
            set 
            {
                _value = value;
                NotifyPropertyChanged("Value");
            }
        }

        public SampleData() {  }

        public void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}

 

Este modelo cuenta con dos propiedades (Name y Value) e implementa INotifyPropertyChanged para poder manejar el Binding de forma correcta.

Ahora creamos el ViewModel. En una aplicación real deberías obtener dichos valores desde un webservice en tu servidor, pero para efectos prácticos, aquí inicializo una lista de objetos SampleData (nuestro modelo) en el constructor del ViewModel.

using System.Collections.Generic;

namespace SilverlightApplication3
{
    public class ViewModel
    {
        public string Title { get; set; }
        public List<SampleData> Samples { get; set; } 

        public ViewModel()
        {
            Title = "Probando graficas";
            Samples = new List<SampleData>();
            Samples.Add(new SampleData() { Name = "Nombre 1", Value = 1 });
            Samples.Add(new SampleData() { Name = "Nombre 2", Value = 4 });
            Samples.Add(new SampleData() { Name = "Nombre 3", Value = 3 });
            Samples.Add(new SampleData() { Name = "Nombre 4", Value = 2 });
            Samples.Add(new SampleData() { Name = "Nombre 5", Value = 5 });
        }
    }
}

 

Finalmente creamos nuestra vista en XAML:

<UserControl x:Class="SilverlightApplication3.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             d:DesignHeight="390"
             d:DesignWidth="638"
             xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
             xmlns:me="clr-namespace:SilverlightApplication3"
             xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit">
    <UserControl.Resources>
        <me:ViewModel x:Key="model" />
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot"
          Background="White"
          DataContext="{Binding Source={StaticResource model}}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="237" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <StackPanel>
            <TextBlock Text="{Binding Title}"
                       FontWeight="Bold"
                       Margin="0,10"
                       HorizontalAlignment="Center" />
            <sdk:DataGrid AutoGenerateColumns="False"
                          x:Name="dataGrid1"
                          VerticalAlignment="Top"
                          ItemsSource="{Binding Samples, Mode=TwoWay}"
                          Margin="10,0">
                <sdk:DataGrid.Columns>
                    <sdk:DataGridTextColumn Header="Nombre"
                                            Binding="{Binding Name}" />
                    <sdk:DataGridTemplateColumn Header="Valor"
                                                Width="150">
                        <sdk:DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <Slider Value="{Binding Value, Mode=TwoWay}"
                                            Maximum="5"
                                            Minimum="0"
                                            Width="100" />
                                    <TextBlock Text="{Binding Value, StringFormat={0:F4} }" />
                                </StackPanel>
                            </DataTemplate>
                        </sdk:DataGridTemplateColumn.CellEditingTemplate>
                    </sdk:DataGridTemplateColumn>
                </sdk:DataGrid.Columns>
            </sdk:DataGrid>
        </StackPanel>
        <Grid Grid.Column="1">
            <toolkit:Chart Margin="10">
                <toolkit:ColumnSeries x:Name="columnSeries1"
                                      ItemsSource="{Binding Samples, Mode=TwoWay}"
                                      IndependentValuePath="Name"
                                      DependentValuePath="Value">
                    <toolkit:ColumnSeries.DependentRangeAxis>
                        <toolkit:LinearAxis Orientation="Y"
                                            Minimum="0"
                                            Maximum="5.5" />
                    </toolkit:ColumnSeries.DependentRangeAxis>
                </toolkit:ColumnSeries>
            </toolkit:Chart>
        </Grid>
    </Grid>
</UserControl>

 

En la línea 13 creamos una instancia de nuestro ViewModel y la agregamos a nuestros recursos locales. Después, en la línea 17 asignamos dicho recurso al DataContext de nuestro LayoutRoot (en este caso el Grid que contiene todos los elementos de la vista). En la línea 30 definimos la propiedad Samples de nuestro ViewModel como la fuente de datos del DataGrid. En la línea 40 definimos el binding a la propiedad Value con un slider para modificar los datos fácilmente. Las líneas 55 y 57 se encargan de hacer lo mismo para la gráfica de barras.

Nótese como los bindings se definien con el Mode=TwoWay para actualizar el ViewModel “de ida y vuelta”, es decir, que los cambios en la vista se reflejan en el ViewModel y viceversa.

Puedes ver el ejemplo corriendo aquí. Y puedes descargar el código aquí.

UPDATE: De pura casualidad encontré mi compañera Araceli Medina encontró un bug en el Silverlight Toolkit mientras jugaba con el demo. Estaba jugando con mover sliders y cambiar el tamaño de la ventana cuando noté que esto pasaba:

Imagen del bug

El borde inferior de los rectangulos no se quedaba en la parte de abajo de la gráfica. No estoy seguro a qué se deba esto pero si se vuelve a cambiar el tamaño de la ventana el problema se corrije. El bug fue dado de alta en codeplex.

Custom Action Filters en ASP.NET MVC

Portada Custom Action Filters

Estaba siguiendo el tutorial de MVC Music Store V2.0 hecho por Jon Galloway (muy recomendable para meterse a ASP.NET MVC 3 con Razor) cuando noté una constante repetición de código necesario para un par de dropdowns en varias vistas del StoreManagerController:

ViewBag.Genres = storeDB.Genres.OrderBy(g => g.Name).ToList();
ViewBag.Artists = storeDB.Artists.OrderBy(a => a.Name).ToList();

 

Si bien son sólo dos lineas de código, me parece muy innecesaria la repetición de este en 4 ActionMethods. Así que se me ocurrió usar un Custom Action Filter para agregar dichas propiedades al ViewBag con un simple atributo, aquí la implementación:

using System.Linq;
using System.Web.Mvc;
using MvcMusicStore.Models;

namespace MvcMusicStore
{
    public class IncludeArtistsGenreAttribute : ActionFilterAttribute
    {
        public MusicStoreEntities db = new MusicStoreEntities();

        public override void OnActionExecuting(
            ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            filterContext.Controller.ViewBag.Genres = 
                db.Genres.OrderBy(g => g.Name).ToList();
            filterContext.Controller.ViewBag.Artists = 
                db.Artists.OrderBy(a => a.Name).ToList();
        }
    }
}

Lo primero que necesitamos es heredar de la clase ActionFilterAttribute para poder hacer override de uno de los siguientes métodos virtuales:

  • OnActionExecuting. El cuál se ejecuta antes del Action method correspondiente.
  • OnActionExecuted. Se ejecuta después de que el Action method termina.
  • OnResultExecuting. Se ejecuta justo antes de regresar el ActionResult del método.
  • OnResultExecuted. Se ejecuta una vez que el ActionResult ha sido regresado.

En este caso el único método que no nos sirve es el OnResultExecuted ya que es demasiado tarde para agregar propiedades al ViewBag. Una vez implementado nuestro atributo, simplemente decoramos los Action methods en donde necesitamos estas propiedades (los que tienen vistas con los dropdown de Géneros y Artistas) de esta manera:

//
// GET: /StoreManager/Create

[IncludeArtistsGenre]
public ActionResult Create()
{
    //ViewBag.Genres = db.Genres.OrderBy(g => g.Name).ToList();
    //ViewBag.Artists = db.Artists.OrderBy(a => a.Name).ToList();

    var album = new Album();

    return View(album);
} 

//
// POST: /StoreManager/Create

[HttpPost]
[IncludeArtistsGenre]
public ActionResult Create(Album album)
{
    if (ModelState.IsValid)
    {
        db.Albums.Add(album);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    //ViewBag.Genres = db.Genres.OrderBy(g => g.Name).ToList();
    //ViewBag.Artists = db.Artists.OrderBy(a => a.Name).ToList();

    return View(album);
}

//
// GET: /StoreManager/Edit/5
[IncludeArtistsGenre]
public ActionResult Edit(int id)
{
    //ViewBag.Genres = db.Genres.OrderBy(g => g.Name).ToList();
    //ViewBag.Artists = db.Artists.OrderBy(a => a.Name).ToList();

    var album = db.Albums.Single(a => a.AlbumId == id);
    return View(album);
}

//
// POST: /StoreManager/Edit/5

[HttpPost]
[IncludeArtistsGenre]
public ActionResult Edit(int id, FormCollection collection)
{
    var album = db.Albums.Find(id);
    if (TryUpdateModel(album))
    {
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    else
    {
        //ViewBag.Genres = db.Genres.OrderBy(g => g.Name).ToList();
        //ViewBag.Artists = db.Artists.OrderBy(a => a.Name).ToList();

        return View(album);
    }
}

 

Nótese que dejé las lineas repetitivas comentadas por motivos ilustrativos pero en realidad habría que borrarlas por completo Smile.

MVC nos incluye varios Action Filters que pueden ser utilizados para cosas como autenticación/autorización, manejo de errores, manejo de cache, etc. Para más información puedes checar el artículo correspondiente en MSDN.

Mitos sobre Silverlight y HTML5

Con todos los eventos descritos previamente en otro post, ha surgido una ola de artículos contra y a favor de Silverlight y HTML5. El objetivo de este post es exponer otros puntos de vista que quizá se hayan perdido por estar a la defensiva.

Rendimiento

Uno de los puntos que mucha gente Pro-Silverlight sacó a relucir es el rendimiento. Esta punto es debatible. Es cierto que hoy una aplicación que utilice la tarjeta de video será mucho más rápida en Silverlight gracias al uso de la aceleración por hardware (actualmente IE9 es el único navegador con soporte para aceleración por hardware). Pero no debes asumir que usar Silverlight es más rápido en todos los casos. Movimientos, fades, rotación y distintos tipos de animaciones serán mejor provistos usando javascript, debido a que el tiempo de carga de un aplicación de Silverlight es mucho mayor que un script de Javascript (aún cuando la más reciente actualización de SL mejoró esto notablemente). Es mejor analizar bien en qué punto el tiempo de carga hace que valga la pena usar SL sobre JS.

Escribe una vez, corre en donde sea

Ninguna de tecnologías te permite hacer esto. Esta frase la he escuchado desde los inicios de Java, pero ninguna tecnología ha podido llegar a este punto. Y para ser sinceros, es una pérdida de tiempo intentar algo así. Cada dispositivo que usamos tiene sus propias características que influyen sobre la forma en que interactuamos con él. Si bien es cierto que una buena arquitectura te puede llevar a compartir las mismas librerías principales, no esperes escribir una aplicación y mandarla a donde sea sin cambiar nada. Eso de que HTML5 requiere escribir un código para cada navegador no es cierto. Herramientas como jQuery te permiten extraer las diferencias y concentrarte en escribir tu aplicación y delegar las diferencias de navegadores a alguien más. Además, les tengo una noticia, con SL también hay casos en los tienes que escribir lógica para ver si estas en Windows, Windows Phone, Mac o Linux (en especial Linux ya que la implementación del plugin, Mono, está apenas a la par con la versión 2.0 de SL).

HTML5 no está listo

¡Tampoco CSS3 y llevamos años usándolo! HTML5 no estará oficialmente listo hasta dentro de muchos años. Sin embargo ya se está usando desde hace tiempo y la implementación en los navegadores continúa mejorando.

No hay herramientas para desarrollar en HTML5

Aquí tienes. Por otro lado, no tengas miedo de salir de Visual Studio de vez en cuando.

Silverlight es mejor para aplicaciones, HTML para sitios

HTML puede generar impresionantes aplicaciones (véase AgileZen)

Silverlight corre en tres pantallas

Silverlight corre en ciertos navegadores, como aplicación nativa en Windows y Mac OS y como aplicación Nativa en un teléfono (WP7). Hasta ahí llega hoy. No corre completamente en Linux (pero ahí va), no corre en teles (aún) y no corre en el navegador de ningún teléfono.

Silverlight (y Flash) morirá(n) gracias al Tag de video de HTML5

Nada podría ser más falso. Silverlight proveé muchos casos de uso que no están ni siquiera planeados para dicho tag. El más mencionado es DRM, pero existen muchísimas experiencias que aún no se pueden lograr con HTML5.  Si bien la mayoría de las aplicaciones de SL que existen no desarrollan todo su potencial, exiten empresas con Vertigo que han sabido explotar todo el poder de la plataforma creando experiencias asombrosas como Hard Rock Memorabilia, Playboy Catalog, las Olimpiadas de Invierno 2010 entre muchas otras.

Silverlight no fue mencionado en el keynote del PDC, por lo tanto morirá

Tampoco hablaron sobre el café en el keynote y dudo que Starbucks vaya a cerrar pronto. Además, si no lo notaron, hicierton un demo de Silverlight para WP7 y hubieron muchísimas sesiones de SL después del keynote.

Y como estos existen muchos mitos más. Cómo siempre, es mejor experimentar de primera mano antes de tomar decisiones.

HTML5 vs Silverlight

Nuestras vidas están llenas de opciones. Todos los días decides levantarte o quedarte en la cama 5, 10, 15, 60 minutos de más. Todos los días decides qué desayunar, qué ruta tomar, qué comer, a dónde salir, qué tomar, por quién votar, en qué dios creer, qué preferencias tener y un largo etcétera. Cómo en todo, cada quien tiene sus preferencias y en muchos casos cree que esa preferencia es mejor que otras. En el caso de la programación o desarrollo, uno escoge su lenguaje y en muchos casos le es fiel hasta la muerte.

En mi caso particular, he pasado por Basic, Pascal, C, C++, FoxPro, VB.NET, C#, HTML, XHTML, Javascript, Silverlight, Flash, Java, PHP etc, etc, etc. En los últimos años me he adentrado en C# y toda la tecnología .NET de Microsoft. Me gusta C#, quizá por mi forma de ser, muy ordenado y el hecho de que me gusta que las cosas hagan sentido y sean cuadradas. Me encantaba la forma en que ASP.NET con sus extensiones de AJAX te permitía hacer páginas que parecían hechas con Javascript pero todo desde código manejado. Hoy en día, detesto este enfoque. El mundo cambió y yo también.

Hace 2 años me adentré al mundo de Silverlight gracias a mi amigo Rodrigo Díaz y me encantó la idea de poder programar una aplicación web como si fuera de escritorio. Conforme pasó el tiempo, fueron sacando mejoras como aplicaciones fueras del navegador que ¡Funcionaban incluso en las Mac! El poder del binding y las plantillas que comenzaron a sacar hacía que programar con Silverlight fuera una experiencia fácil y rápida. Cuando conocí MVVM simplemente quedé enganchado. Soy fan de las arquitecturas y MVVM es simplemente genial con Silverlight.

Hace 1 año comencé a adentrarme al mundo de ASP.NET MVC y jQuery. MVC fue para mí, como dicen por ahí, una bocanada de aire fresco. Estaba harto de ASP.NET y su lentitud y falta de compatibilidad con estándares. MVC es rápido, ligero, limpio y genera HTML compatible con cualquier navegador. Siempre le había tenido miedo a Javascript, pero jQuery lo hizo tan fácil que ahora me gusta tanto que me estoy metiendo más a fondo en Javascript como lenguaje y me asombro de todo lo que puede hacer. Con las nuevas características que se están introduciendo con HTML5, existe un gran potencial para hacer aplicaciones Web sin necesidad de instalar un plugin adicional.

Hace unos meses Brad Becker del equipo de Silverlight escribió un interesante artículo sobre el futuro de Silverlight. En dicho artículo destaca los diferentes puntos en los que Silverlight complementa HTML5. Esto me parece muy importante. Desde el principio, la gente dijo que Silverlight llegó a competir con Flash (incluso yo llegué a pensarlo) y ahora dicen que compite con HTML5. Nada podría ser más falso (bueno, con Flash si tiene algo de verdad). Si bien existen puntos que las 3 tecnologías tocan, cada una tiene sus características que las hacen únicas. Además, aún cuando no compiten del todo, el simple hecho de que existan hace que cada tecnología genere más innovaciones para no quedarse atrás.

La semana pasada, Mary-Jo Foley, escritora de la columna “All about Microsoft” para ZDNET escribió un artículo llamado “Microsoft: Our strategy with Silverlight has shifted”, en el que entrevista a Bob Muglia, Presidente de la división de Servidores y Herramientas de Negocios de Microsoft. Este artículo generó polémica e ira entre programadores y tomadores de decisiones. En él Muglia menciona que su enfoque con Silverlight ha cambiado y que HTML es la verdadera solución multiplataforma. Los medios y Twitter estallaron con suposiciones de que Silverlight estaba muerto. Todo esto se dejó crecer durante el fin de semana y el lunes el mismo Muglia publicó un comunicado confirmando su compromiso con Silverlight. Incluso, la misma Foley comentó como todo había sido malinterpretado.

En mi opinión, Muglia no dijo nada que no fuera verdad. Silverlight sigue siendo una excelente herramienta para desarrollo para web, cliente, Windows Phone y próximamente TVs (lo cual puede ser algo muy grande, en especial compitiendo con algo como Google TV). HTML es la verdadera solución multiplataforma. Funciona en todos los sistemas operativos, todos los navegadores (obvio) y en todos los teléfonos con navegador (muchos que ni siquiera son smartphones). Mucha gente defiende una herramienta o la otra a capa y espada, pero como dije al principio, son sólo opciones, ninguna es mejor que otra en todos los casos. Uno como desarrollador debe analizar cada situación y usar lo que mejor se aplique. No vas a poner a hacer una base de datos en HTML ni vas a ponerte a hacer sistemas de soporte de vida en Silverlight. Como desarrolladores tenemos que saber muchos lenguajes, y si te quieres encerrar en uno sólo creo que te estás perdiendo de muchas cosas y no estás alcanzando todo tu potencial y el de la tecnología misma.

Existen muchos mitos sobre Silverlight y HTML5 (que dejaré para otro post), lo mejor es que tu mismo pruebas de primera mano cómo son ambas herramientas (o muchas otras) antes de formar tu opinión sobre ellas. Si no has usado una y sólo te basas en comentarios de otras personas, mejor no critiques sobre lo que no conoces. Esa mentalidad de “mi lenguaje es mejor que el tuyo” sólo estorba. Conoce tu herramienta, echa un vistazo a otras herramientas y usa la que más te guste y/o mejor se acomode a tus necesidades.

A mi me gusta desarrollar para la web. Si Silverlight desaparece en 2 o 3 años, ni modo. Si HTML5 no está listo antes de que se acabe el mundo, pues que así sea. La vida sigue y la tecnología avanza muy rápido como para andar discutiendo quien tiene la mejor herramienta.

Arcade Fire y el poder de html5

Este grupo canadiense ya me había sorprendido antes con su video “Neon Bible”. Esta es una animación hecha en flash con la cual puedes interactuar para crear tu propia versión del video. La idea se me hizo genial.

Pero esta vez, Arcade Fire y Google van mucho más alla, haciendo el video de la canción “We used to wait” un experimento con html5 que muestra el potencial de esta tecnología que si bien no cuenta con una especificación terminada, ya está dando muestras del poder con el que cuenta.

En la página en cuestión (que por cierto, recomiendan altamente el uso de Google Chrome) tu puedes escribir la dirección del barrio donde creciste (yo tuve que insertar una dirección en Estados Unidos pues la de México no me funcionó). Después de un tiempo de carga un poco largo (pero que vale la pena) podrás ver como se desarrolla el video en distintas ventanas, algunas de las cuales muestra imágenes y vistas de la dirección que escribiste.

Qué bueno ver a grupos rompiendo esquemas en una época donde la industria musical está en decadencia y que bueno ver el potencial de html5 en acción.

image

image

image

image

Evento: Conoce Windows Phone 7

Las herramientas de desarrollo finales para Windows Phone 7 serán liberadas (16 de septiembre) y la versión final del sistema operativo ya fué liberada a las empresas encargadas de fabricar el hardware. Estamos cada vez más cerca del lanzamiento de este teléfono el cúal en lo personal espero con ansias (ya que mi actual teléfono acaba de descomponerse de la bocina, snif).

En vísperas de dichos aconteciemientos en La Liga Silverlight estamos organizando un evento para dar a conocer las herramientas de desarrollo para el Windows Phone 7. Aquí la información:

UPDATE: Debido a que otro evento de la misma índole se llevará a cabo en la misma fecha por parte de Microsoft, nuestro evento se moverá para un día después, misma hora, mismo lugar.

Fecha: 29 de septiembre 30 de septiembre del 2010
Hora: 18:30
Lugar: Centro del Software
Av. López Mateos Sur 2077-Z Sala 2.
Col. Jardines de Plaza del Sol
C.P. 44510, Guadalajara, Jalisco, México

Agenda:

Tema Expositor
Introducción a Windows Phone 7: Una propuesta diferente y una gran oportunidad (Intoducción y Market place)

Jorge Levy

Arquitectura y desarrollo de Aplicación en Windows Phone 7 con Silverlight Arturo Molina
Desarrollo de juegos para Windows Phone con XNA Framework

Tarcisio de la Vega

Puedes registrarte aquí (La fecha y la hora están mal en esa liga, pero si es ahí donde tienes que registrarte).

Actualización de Silverlight 4

El día de ayer se liberó una actualización para Silverlight 4 (Versión 4.0.50826.0 para ser exactos). Este es un pequeño resumen de lo que incluye esta actualización:

  • Habilidad para agregar una nueva fila al control DataGrid
  • Mejoras el tiempo de carga de las aplicaciones
  • Soporte para la rueda del mouse en las aplicaciones fuera del navegador para Mac
  • Se arreglaron unos bugs relacionador con el uso de DRM para contenido multimedia
  • Se arregló una fuga de memoria relacionada con el uso de MouseCapture
  • Se arregló una fuga de memoria relacionada con el uso de DataTemplate

Aquí los pasos para bajar la nueva versión:

Para usuarios finales

Lo recomendado en el post de Tim Heuer es modificar el tag de object que hospeda nuestro xap dentro de nuestra página:

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
  width="640" height="400">
    <param name="source" value="YOUR_PATH_TO_XAP" />
    <param name="background" value="white" />
    <param name="minRuntimeVersion" value="4.0.50826.0" />
    <param name="autoUpgrade" value="true" />
      <a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=4.0.50826.0" style="text-decoration: none">
        <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight"
          style="border-style: none" />
       </a>
</object>

La clave aquí están en las líneas 5 y 6, minRuntimeVersion indica que la versión mínima requerida para correr la aplicación y autoupgrade le pedirá permiso al usuario para actualizar la aplicación si la versión de Silverlight instalada es menor a la requerida.

Para desarrolladores

Debes actualizar tanto el developer runtime como el SDK (preferentemente en ese orden). Aquí las ligas para realizarlo:

Una vez instalados el runtime y el SDK puedes crear un nuevo proyecto de Silverlight y el tag de object reflejará automáticamente la nueva versión:

image

Puedes leer más información en el post de Tim Heuer y en el Knowledge Base de la actualización (KB2164913).

ASP.NET MVC3 Preview 1 – Datos de la Vista dinámicos

Una de las nuevas características de MVC3 será la posibilidad de crear datos para la vista y pasarlos a la vista por medio de una variable de tipo dynamic. Esto es congruente con la idea de Microsoft de hacernos escribir cada vez menos código (como es el caso del nuevo ViewEngine Razor).

ASP.NET MVC3 Preview 1 – Índice

  1. Introducción
  2. Datos de la Vista dinámicos

NOTA: Este post es sobre una versión muy temprana de lo que será MVC3. Todo lo que está aquí esta sujeto a cambios drásticos mientras no se indique lo contrario.

Anteriormente, MVC nos permitía mandar cierta información del controlador a la vista usando un diccionario de tipo ViewDataDictionary que permitía almacenar todo tipo de información.

Dicho diccionario se llenaba como cualquier otro diccionario en el controlador:

ViewData["MensajeViewData"] = "Mensaje desde ViewData";

Y se accedia de la misma manera en la vista:

<%: ViewData["MensajeViewData"] %>

Ahora bien, lo nuevo en MVC3 es una nueva variable que en el controlador podemos es llamada ViewModel y es de tipo dinámico, osea, podemos asignar un valor del siguiente modo:

ViewModel.MensajeViewModel = "Mensaje desde ViewModel";

Y accederlo desde la vista de la siguiente manera:

<%: View.MensajeViewModel %>

¿En qué beneficia esto? Pues quizá no parezca mucho, pero nos ahorra 3 caracteres por casa variable que usamos (usar los dos corchetes y las comillas vs solo usar un punto).

¿Por qué no se llama igual la variable en el controlador (ViewModel) y en la vista (View)? De acuerdo con Phil Haack, el problema fue que cuando estaban implementando esta funcionalidad, lo hicieron primero en la vista, y escogieron el nombre View por ser corto y claro. El problema fue cuando portaron la funcionalidad a la clase Controller ya contenía un método llamado View, por lo que tuvieron que usar un nombre disponible como ViewModel que es más largo y va en contra de su objetivo de hacernos teclear menos. En mi humilde opinión, el hecho de que los datos introducidos en ViewData y ViewModel en el controlador pueden ser accedidos por medio de View (y ViewData para el caso), el nombre View está bien, pero puede haber quien encuentre esto un tanto confuso.

Otra cosa interesante es que el tipo dynamic nos permite almacenar no sólo objetos sino también funciones. Por ejemplo:

public ActionResult Index(){    ViewModel.MensajeViewModel = "Pasando una función";

    Func<int, int, string> funcionEsMayorQue =         (operador1, operador2) =>             operador1 > operador2 ? "Es mayor" : "No es mayor";

    ViewModel.EsMayorQue = funcionEsMayorQue;

    return View();}

Definimos una expresión lambda, en la cuál se recibirán dos enteros y se regresará un string indicando si el primer entero es mayor al primero o no (me rompí la cabeza pensando en este ejemplo). Esta función puede ser invocada en la vista de la siguiente manera:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">    <h2><%: View.MensajeViewModel %></h2>

    <p>23 <%: View.EsMayorQue(23,7) %> que 7</p></asp:Content>

Lo cuál nos resulta en algo como esto:

image

Esto fué un pequeño vistazo a esta la nueva funcionalidad de MVC3 para usar datos de la vista almacenados en una variable de tipo dynamic, la cuál no sólo nos permite almacenar objetos sino también funciones.