2012-09-10 19 views
5

Soy moderadamente nuevo en MVVM y entiendo algunos de los beneficios de MVVM sobre el código simple detrás de xaml (por ejemplo, la capacidad de prueba de la máquina virtual). Estamos utilizando Caliburn Micro para realizar algunos de los enlaces, pero eso es irrelevante, podría estar usando un enlace específico {binding ...} y mi pregunta sería más o menos la misma.¿Comprueba el tiempo de comprobación de enlaces?

Entiendo la lógica de que la VM no debe saber nada de la V si todo se hace correctamente, pero parece que debido a que estamos utilizando un enlace de tiempo de ejecución dinámico entre la V y la VM que el compilador no puede verificar legalidad de cada expresión vinculante. Por ejemplo, si tengo un componente UI llamado UserName, entonces Caliburn intentará vincularlo a una propiedad de máquina virtual llamada UserName en tiempo de ejecución (similar a hacer algo como Value = "{binding UserName}"). Sin embargo, si cambio el nombre de mi propiedad de VM o deletreo incorrecto el nombre del componente de UI o la expresión de enlace, no recibimos ninguna indicación de problema hasta el tiempo de ejecución.

Me parece que sería muy bueno poder decirle a la xaml que un componente de UI o página va a estar vinculado a una interfaz específica para que el compilador pueda hacer parte del trabajo que de otro modo tendría para ser hecho (y vuelto a hacer) por el departamento de pruebas (y ese soy yo con bastante frecuencia).

¿Hay alguna manera de decirle a xaml que estamos vinculados a una interfaz o tipo de objeto? ¿Hay alguna herramienta que pueda conectarse a una aplicación xaml para validar enlaces?

Respuesta

4

Mientras que el compilador no proporciona soporte para los controles de tiempo de compilación de XAML, es probable que pueda lograr el mismo resultado escribiendo una tarea de generación personalizada que crea instancias de cada archivo XAML a través de la clase XAMLReader y, a continuación, utilizando un custom TraceListener para escuchar errores vinculantes

Más allá de eso, si está preparado para hacer su enlace de datos mediante el código, puede crear enlaces que hagan referencia directamente a nombres de propiedades. Algo así como lo siguiente (no probado)

Binding createBinding<TProperty>(Expression<Func<TProperty>> property, object source) 
{ 
    MemberExpression me = property.Body as MemberExpression; 
    if (me == null || me.Expression != property.Parameters[0] 
      || me.Member.MemberType != MemberTypes.Property) { 
     throw new InvalidOperationException(
      "Now tell me about the property"); 
    } 
    Binding b = new Binding(me.Member.Name); 
    b.Source = source; 

    return b; 
} 

// sample code 
Binding b = createBinding(()=>this.FontSize, this); 
textBlock1.SetBinding(TextBlock.FontSizeProperty, b); 
-1

Puede verificar fácilmente si alguno de sus enlaces ha fallado al buscar errores de enlace en la ventana de salida durante el tiempo de ejecución. Es posible que deba configurar la información de depuración para el enlace a verbose.

+0

-1: El OP pidió explícitamente una solución en tiempo de compilación. –

+0

aha ... esta es una alternativa –

+3

No lo es. El OP ya sabe sobre esto y no quiere usarlo. –

Cuestiones relacionadas