2012-08-15 13 views
6

En el ejemplo siguiente, hemos vinculado un ViewModel a una vista con una sola propiedad llamada Message. Esta propiedad está vinculada a un TextBox con un enlace bidireccional. Para esta prueba, estamos haciendo algo de coerción de valor en el colocador y elevando la propiedad cambiada de nuevo.Coerce Value en Property Setter - Silverlight 5

En Silverlight 4, esto funcionó a la perfección. Si la propiedad del mensaje cambió en el establecimiento de propiedades, el cuadro de texto vería el nuevo valor. P.ej. escribir "A" en el cuadro de texto y perder el foco daría como resultado que apareciera Aaaaaaaaaaa a medida que se cambiaba el valor.

En Silverlight 5 sin embargo, esto parece estar roto/cambiado. El getter nunca se golpea después de que el valor se modifique en el setter. Agregar un IValueConverter en el medio, muestra que los métodos Convert/ConvertBack nunca se golpean. Parece que algo fundamental ha cambiado entre la versión 4 y 5. ¿Ha habido algún cambio? ¿Es esto un error?

public class ViewModel : INotifyPropertyChanged 
{ 
    private string _message; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public string Message 
    { 
     get 
     { 
      return _message; 
     } 
     set 
     { 
      _message = value; 
      this.RaisePropertyChanged(); 

      if (_message.Length < 10) 
      { 
       _message = _message.PadRight(10, 'a'); 
       this.RaisePropertyChanged(); 
      } 
     } 
    } 

    private void RaisePropertyChanged() 
    { 
     var handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs("Message")); 
     } 
    } 
} 

Respuesta

1

Esto ha sido confirmado como un error en Silverlight 5 por Microsoft. Solo ocurre en el modo de depuración, por lo que está bien para el modo de lanzamiento.

Si deshabilita la depuración de enlace XAML, el problema ya no existe.

Binding.IsDebuggingEnabled = false; 
3

Hay un par de soluciones para este problema que parece ser un error en función de depuración de unión de Silverlight 5 (véase la respuesta de @Ray Booysen).

En primer lugar, es importante saber que esto no es un problema en la producción sino que solo ocurre mientras se depura la aplicación. Por lo tanto, las soluciones son en realidad solo para reproducir el comportamiento de producción en el entorno de depuración (aunque con algunas de las funciones de depuración desactivadas).

El primero de los problemas consiste en desactivar la depuración del enlace utilizando el campo estático (compartido en VB.Net) llamado IsDebuggingEnabled en la clase Binding. La documentación allí proporciona la siguiente recomendación.

establece este campo en falso en su constructor de la clase de aplicación

Nota: Este cambio no puede limitarse a una sola unión, sino más bien afectará a todos los enlaces en la aplicación.

El segundo es desactivar el depurador de Silverlight en las propiedades del proyecto web que aloja la aplicación Silverlight. Haga este cambio usando los siguientes pasos.

  1. Haga clic con el botón derecho en el proyecto web en el Explorador de soluciones y seleccione Propiedades.
  2. Seleccione la pestaña Web.
  3. Desplácese hasta la sección Depuradores.
  4. Desmarque la casilla de verificación etiquetada Silverlight.

Nota: Este cambio no sólo desactiva la depuración vinculante para la aplicación, sino también la depuración Silverlight general. Sin embargo, otros depuradores pueden ser habilitados.

Cuestiones relacionadas