2010-04-28 7 views
5

Ich habe eine Business-Anwendung (aus Vorlage erstellt), und ich kann die Sprache dynamisch ändern, indem ResourceWrapper INotifyPropertyChanged machen und dann in Code hinzufügen:Lokalisierung in Silverlight 4 mit 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(); 
} 

das funktioniert gut auf Ressourcen referenziert/binded in xAML-Dateien (zB Mainpage Rahmen), aber es nicht Update Referenzen von etwas habe ich in Code deklariert dh

InfoLabel.Content = ApplicationStrings.SomeString 

im Moment bin ich mit ResourceWrapper nicht. Meine Frage hier ist, wie kann ich meinen Code ändern, so dass es verwendet und aktualisiert wird, wenn ResourceWrapper ändern. Ich habe versucht:

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

aber es funktioniert nicht.

Irgendwelche Ideen?

Antwort

2

Sie müssten eine Bindung im Code erstellen. Etwas wie folgt aus:

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

Beachten Sie, dass die Klasse, die Sie binden müssen INotifyPropertyChanged implementieren.



EDIT: Wenn Sie sich Sorgen um die Menge an Code sind, erstellen Sie einfach eine Hilfsmethode irgendwo in Ihrer App:

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

      return b; 
     } 

Und dann die Hilfsmethode wie folgt verwenden:

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

Das scheint eine Menge Arbeit für so eine einfache Sache zu sein. Wenn ich es für jede Zeichenfolge tun müsste, die ich im Code binden möchte, würde ich wahrscheinlich NavigationService.Refresh() verwenden, aber das ist nicht optisch elegant ... – Artur

+0

Sie haben Recht, es ist eine Menge Code. Deshalb sollten Sie es am besten vermeiden und Ihre Bindungen direkt im XAML deklarieren. Gibt es einen Grund, warum Sie den Text des Contentcontrols im Code einstellen müssen? –

+0

Ich habe eine Hilfsmethode hinzugefügt, die die Menge an Code auf eine Zeile reduziert. –