Condenado error que me salía en el Blend, este era el escenario: Tenía una aplicación pequeña que se conectaba con SQL Server 2005 para obtener una lista de datos y, mostrarlos en un ListView usando un ObjectDataProvider para el enlace de datos (DataBindig), la aplicación se ejecutaba sin problemas, pero al momento de ver la ventana en el diseñador, el ListView mostraba el error “Cannot Create an Instance of an Object”, que podría ser!, pues el error indicaba claramente que alguna de las clases (Bll, Dto, Dal) usadas en el DataBind no se podían instanciar, ahí me di cuenta que Blend intentaba ejecutar el código en tiempo de diseño para dibujar el control, entonces en tiempo de diseño tenía un error de compilación (uhh??), bueno ahora el siguiente paso era ver que parte del código no podía ser ejecutada por el diseñador:
- Clases estáticas… OK
- Propiedades… OK
- Constructor…OK
- Constantes…OK
- Acceso al app.config…OK
- Referencias a otros ensamblados (Bll, Dto, Dal)… OK
- Conexión a la Base de Datos… ERROR !!, el diseñador no puede crear una conexión a una base de datos usando SqlConnection, por lo todas las clases que lo invocaban no podía ser creadas (no se puede crear una instancia de un objeto) y el diseñador generaba el error.
No me parece mal que en tiempo de diseño, Blend no se pueda conectar con una base de datos, pero ahora cómo resuelve el problema con el diseñador, después de todo el mensaje de error no era lo único, tampoco podía mover de lugar el control. La solución era obvia, en el código del CLR detectar si estaba en modo diseñador o modo ejecución, por suerte fue algo bastante sencillo gracias a Google:
List<string> listaDatos = new List<string>();
if (!DesignerProperties.GetIsInDesignMode(new DependencyObject()))
listaDatos = FuenteDatos.CargarTodos();
Y solucionado el inconveniente: si NO está en modo diseñador, conectar con la BDD y cargar los datos.
De aquí no es difícil poder simular los datos para que aparezcan en el diseñador:
List<string> listaDatos = new List<string>();
if (!DesignerProperties.GetIsInDesignMode(new DependencyObject()))
{
listaDatos = FuenteDatos.CargarTodos();
}
else
{
listaDatos.Add("Cadena de Ejemplo 1");
listaDatos.Add("Cadena de Ejemplo 2");
}
Cuando se abra el control en el diseñador se mostrarán las cadenas de ejemplo y cuando se ejecute la aplicación se cargarán los datos de la bdd, muy útil para tomar en cuenta.
::Fin de la Transmisión::