Blend – Cannot create an instance of an object…

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:: 

2 comentarios to “Blend – Cannot create an instance of an object…”

  1. […] Tercero, antes de invocar al método de la Bll que consulta los datos, primero verificamos si la ventana está abierta en el diseñador, si está en el diseñador NO nos conectamos a la base y llenamos la lista con datos de ejemplo, caso contrario (cuando el programa está en ejecución) se conecta a la base. Esto es porque en tiempo de diseño Blend intenta compilar y ejeuctar este código y produciría un error al momento de tratar de  conectar con la base. En este artículo se explica el por qué de este error. […]

  2. Hola que tal ! esta bueno tu blog eh !! muy buen trabajo el tuyo estado leyendo todos tus articulos🙂 … me han servido de mucho.

    Saludos

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

A %d blogueros les gusta esto: