property event ejemplo change c# .net wpf binding inotifypropertychanged

c# - ejemplo - Evento PropertyChanged siempre nulo



wpf inotifypropertychanged (8)

Tengo lo siguiente (abreviado) xaml:

<TextBlock Text="{Binding Path=statusMsg, UpdateSourceTrigger=PropertyChanged}"/>

Tengo una clase singleton:

public class StatusMessage : INotifyPropertyChanged { private static StatusMessage instance = new StatusMessage(); private StatusMessage() { } public static StatusMessage GetInstance() { return instance; } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string status) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(status)); } } private string statusMessage; public string statusMsg { get { return statusMessage; } set { statusMessage = value; OnPropertyChanged("statusMsg"); } } }

Y en mi ventana principal constructor:

StatusMessage testMessage = StatusMessage.GetInstance(); testMessage.statusMsg = "This is a test msg";

No puedo hacer que el bloque de texto muestre el mensaje de prueba. Cuando controlo el código a través de la depuración, PropertyChanged siempre es nulo. ¿Algunas ideas?


Gracias Jerome! Una vez que configuré DataContext, ¡comenzó a funcionar como debería! Agregué lo siguiente al constructor de la ventana principal para fines de prueba:

this.DataContext = testMessage;


Hay un par de elementos para verificar cuando se observa el objeto evento EventChanged como nulo.

  1. Asegúrese de que el nombre de propiedad pasado como argumento al generar el evento realmente coincida con el nombre de la propiedad a la que se dirige.

  2. Asegúrese de estar utilizando solo una instancia del objeto que contiene la propiedad a la que se está vinculando.

Para el elemento número dos, esto se puede hacer simplemente colocando un punto de corte en el constructor de la clase para el objeto que alberga la propiedad que se está vinculando. Si el punto de interrupción se activa más de una vez, entonces usted tiene un problema y necesita resolver el número de instancias de objetos en una sola instancia que invoca su tiempo de ejecución a través de XAML.

Por lo tanto, es mejor implementar esa clase como un patrón singleton para que pueda garantizar solo una instancia del objeto en tiempo de ejecución.


Me encontré con esto hoy y perdí algo de tiempo en él, y finalmente lo descubrí. Espero que esto ayude a salvarte a ti y a los demás en algún momento.

Si no hay suscriptores a su evento, y simplemente declaró los eventos como:

public event EventHandler SomeEventHappened;

Entonces se espera una referencia nula . La forma de evitar esto es declarar de la siguiente manera:

public event EventHandler SomeEventHappened = delegate { };

Esto asegurará que no sea una referencia nula cuando llame como

SomeEventHappened()

Otro patrón que he visto es no inicializar para delegar {} y en su lugar comprobar nulo:

var eventToRaise = SomeEventHappened; if( eventToRaise != null ) { SomeEventHappened() }


Otro punto: para PropertyChanged es null, asegúrese de vincular el objeto al DataContext y luego establecer la ruta en lugar de asignar directamente la propiedad al campo de la interfaz de usuario.


Por las dudas: tuve un problema similar, pero mi error fue que la clase que implementó INotifyPropertyChanged era privada. Hacerlo público resolvió mi caso.


Si sigue todas las instrucciones, verifica que el nombre de su propiedad es correcto, que se le está asignando correctamente un nuevo valor, está utilizando un singleton para garantizar una instancia de su modelo y ha asignado con éxito su DataContext en la IU - asegúrese que lo que sea que fuerce a su propiedad a actualizar se hace después de que el árbol visual se haya completado, es decir, mueva la actualización de su propiedad a un botón, en lugar de decir el evento Loaded de su ventana. Digo esto porque tuve el mismo problema y descubrí que cuando actualicé la propiedad de datos de mi modelo de vista desde el evento Loaded de mi ventana de cinta Infragistics NetAdvantage, mi evento PropertyChanged siempre fue nulo.


Su cadena OnPropertyChanged debe coincidir exactamente con el nombre de la propiedad, ya que distingue entre mayúsculas y minúsculas.

Intenta cambiar

OnPropertyChanged("StatusMsg");

a

OnPropertyChanged("statusMsg");

Actualización: Además, acaba de notar que está vinculando a StatusMsg (''S'' mayúscula); por lo que el control no era vinculante para la propiedad, ¡que es otra razón por la cual no estaba actualizando!


También he visto que el evento PropertyChanged es nulo cuando tengo datos existentes asignados a la propiedad de datos enlazados del control:

<TextBlock Name="CarTireStatus" Text="{Binding TireStatus}" >Bad Text!</TextBlock>

Donde como esto funciona:

<TextBlock Name="CarTireStatus" Text="{Binding TireStatus}" ></TextBlock>