Estoy trabajando en una aplicación de Silverlight utilizando V3 SP1 de MVVM Light Toolkit.Notificar que todas las propiedades han cambiado en ViewModel
Mi aplicación es totalmente francesa/inglesa. Todos los elementos de la interfaz de usuario (botones, etiquetas, etc.) y todos los datos (modelos). Necesito el cambio de idioma dinámico y esto está completamente implementado y funciona con cualquier cosa que provenga de un archivo de recursos. Lo que estoy luchando es con ViewModels.
Los modelos tienen propiedades específicas del lenguaje (DescriptionEn, DescriptionFr) y una propiedad adicional llamada LocalizedDescription que utiliza la cultura actual para devolver la llamada a la propiedad específica del idioma.
Cuando el idioma cambia (mediante un clic de botón) levanto y transmito (a través del Messenger) un evento de propiedad modificada.
En cada una de mis ViewModels, me registro para recibir el mensaje de cambio de propiedad para el intercambio de idiomas.
Quiero notificar a todas las propiedades del ViewModel que algo ha cambiado.
The PropertyChanged event can indicate all properties on the object have changed by using either null or String.Empty as the property name in the PropertyChangedEventArgs.
Sin embargo, dado que el conjunto de herramientas abstrae la elevación del evento modificado con RaisePropertyChanged (...) No puedo conseguir que esto funcione. También he examinado el origen de los takeit y he descubierto que RaisePropertyChanged llama a VerifyPropertyName (..), que a su vez devuelve un error, ya que la propiedad no pertenece al ViewModel. También noté que el método VerifyPropertyName se atribuye con Conditional ("DEBUG"), pero incluso si elijo la configuración de Release, la ArgumentException ("Propiedad no encontrada") aún se genera.
¿Alguien sabe de una manera de hacer que esto funcione usando el kit de herramientas aparte de llamar manualmente a RaisePropertyChanged para cada propiedad del ViewModel?
Seguimiento:
Basado en el comentario de Simon, que intentó crear mi propia clase que se extiende ViewModelBase. Miré la fuente en CodePlex y decidí crear un único método llamado RaiseAllPropertyChanged(). Simplemente sería una copia de RaisePropertyChanged (string propertyName) pero sin el parámetro y sin la llamada a VerifyPropertyName (...). No puedo hacer que funcione. Esto es lo que tengo.
public class ViewModelBaseExtended : ViewModelBase
{
protected void RaiseAllPropertyChanged()
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(String.Empty));
}
}
}
Pero obtengo un error del compilador: The event 'GalaSoft.MvvmLight.ViewModelBase.PropertyChanged' can only appear on the left hand side of += or -=
. Esta es una copia del código que se usa en ViewModelBase.
¿Alguien puede ofrecer algún consejo sobre cómo hacer que esto funcione?
Solución:
he copiado todo el código de ViewModelBase en una nueva clase. Luego agregué el método RaisePropertyChanged()
mencionado anteriormente que ejemplifica la clase PropertyChangedEventArgs
con String.Empty
. Esta es ahora la nueva subclase para mis ViewModels.
¡Gracias de nuevo a Simon por liderar el camino!
¿por qué se le notifica para todos modos? – Simon
Notifico todas las propiedades porque necesito que vuelvan a leer sus datos debido a un cambio de idioma. Por ejemplo, tengo un ViewModel que tiene 10 propiedades. Esas propiedades son colecciones de datos que tienen descripciones en francés e inglés y se representan en tiempo de ejecución en el idioma actual. Cuando se cambia el idioma actual, necesito notificar todas las propiedades para que sus datos ahora se muestren en el nuevo idioma actual. Aunque, al implementar la solución anterior, todavía estoy luchando para obtener los datos para cambiar de idioma. Pero el problema de notificar a todos está resuelto. –