2010-04-28 21 views
5

tengo una aplicación de negocios (creado a partir de la plantilla) y puedo cambiar el idioma de forma dinámica al hacer ResourceWrapper INotifyPropertyChanged y luego añadir en el código:Localización en Silverlight 4 usando ResourceWrapper

private void Language_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
Thread.CurrentThread.CurrentCulture = 
    new CultureInfo(((ComboBoxItem)((ComboBox)sender).SelectedItem).Tag.ToString()); 
Thread.CurrentThread.CurrentUICulture = 
    new CultureInfo(((ComboBoxItem)((ComboBox)sender).SelectedItem).Tag.ToString()); 
((ResourceWrapper)App.Current.Resources["ResourceWrapper"]).ApplicationStrings = 
    new ApplicationStrings(); 
} 

esto funciona bien en los recursos referenciados/binded en archivos XAML (es decir, el marco MainPage), pero no actualizar las referencias de todo lo que he declarado en el código es decir

InfoLabel.Content = ApplicationStrings.SomeString 

por el momento no estoy usando ResourceWrapper. Mi pregunta aquí es cómo puedo cambiar mi código para que lo use y actualice cuando cambie ResourceWrapper. Intenté:

InfoLabel.Content = ((ResourceWrapper)App.Current.Resources["ResourceWrapper"]) 
    .ApplicationStrings.SomeString 

pero no funciona.

¿Alguna idea?

Respuesta

2

Debería crear un enlace en el código. Algo como esto:

var b = new Binding("SomeString"); 
b.Source = ((ResourceWrapper)App.Current.Resources["ResourceWrapper"]).ApplicationStrings; 
b.Mode = BindingMode.OneWay; 
InfoLabel.SetBinding(ContentControl.ContentProperty, b); 

Tenga en cuenta que la clase que se unen a debe implementar INotifyPropertyChanged.



EDIT: Si usted está preocupado por la cantidad de código, basta con crear un método de ayuda en algún lugar de su aplicación:

public Binding GetResourceBinding(string key) 
     { 
      var b = new Binding(key); 
      b.Source = ((ResourceWrapper)App.Current.Resources["ResourceWrapper"]).ApplicationStrings; 
      b.Mode = BindingMode.OneWay; 

      return b; 
     } 

y luego usar el método de ayuda como esto:

InfoLabel.SetBinding(ContentControl.ContentProperty, GetResourceBinding("SomeString")); 
+0

Eso parece ser una gran cantidad de trabajo para algo tan simple. Si tuviera que hacerlo por cada cadena que quiera enlazar en código, probablemente usaría NavigationService.Refresh(), pero esto no es visualmente elegante ... – Artur

+0

Tienes razón, es un montón de código. Por eso es mejor evitarlo y declarar sus enlaces directamente en el XAML. ¿Hay alguna razón por la que deba establecer el texto del control de contenido en el código? –

+0

Agregué un método auxiliar que reduce la cantidad de código a una línea. –

Cuestiones relacionadas