c# - español - WPF MVVM DataBindings deja de actualizar
inotifypropertychanged xamarin forms (2)
Puede ser víctima de referencias débiles excesivamente celosas. Puede haber una solución para su marco MVVM. De lo contrario, esta información puede ayudarlo a encontrar el problema en el código fuente.
Existe una pérdida de memoria conocida en la mayoría de las implementaciones de INotifyPropertyChanged. El modelo de vista toma una referencia difícil en el delegado del controlador PropertyChanged del control XAML. Ese delegado a su vez toma una referencia difícil en el control XAML. Debido a esto, el control no se puede recopilar mientras exista el modelo de vista.
Entonces, para solucionar este problema, muchas estructuras MVVM usan referencias débiles para eventos . Si bien esto puede corregir la pérdida de memoria, también puede causar el problema que está viendo. Si el evento débil no se implementa correctamente, podría eliminarse antes de que el control XAML realmente se recopile.
Sospecho que está utilizando un marco MVVM con referencias débiles, y que están siendo eliminados prematuramente. Para ver si este es un problema probable, realice algunas llamadas a GC.Collect () y vea si el problema ocurre con más frecuencia.
Estoy trabajando en una aplicación WPF de tamaño mediano que utiliza el patrón MVVM. ViewModels utiliza INotifyPropertyChanged
para actualizar sus Vistas respectivas.
Este enfoque funciona perfectamente, excepto por un problema: cuando esta aplicación se deja funcionando durante largos períodos de tiempo (3-7 días), las Vistas (¡cada Vista en la aplicación completa!) De repente dejan de actualizar sus propiedades vinculadas.
Si configuro un punto de interrupción en ViewModels, se están moviendo felizmente, llamando a PropertyChanged
como si nada estuviera mal. Sin embargo, si configuro un punto de interrupción en el captador de uno de los objetos de ViewModel a los que está vinculada la Vista, ¡nunca se llama al getter!
Estoy perplejo en este punto, y ni siquiera sé cómo depurar este problema correctamente. Revisé la ventana de resultados de Visual Studio para ver si hay errores de enlace de datos, pero todo parece normal. Es casi como si el motor de enlace de datos de WPF se hubiera estrellado en el fondo. Esta aplicación también supervisa las excepciones no controladas ( AppDomain.UnhandledException
y Dispatcher.UnhandledException
), pero no se lanzan excepciones.
Resumen: después de largos períodos de tiempo, las Vistas dejan de actualizar sus enlaces de datos, pero los Modelos de Vista siguen llamando al evento PropertyChanged.
¿¿¿Algún consejo???
Después de varios meses de depuración, finalmente pude resolver el problema adjuntando un depurador al objetivo remoto. Solo entonces produjo una excepción que pude depurar. Todavía no entiendo por qué AppDomain.UnhandledException y Dispatcher.UnhandledException no captaron esta excepción, pero al menos pude averiguarlo.