我有一个业务应用程序(从模板创建),我可以通过生成ResourceWrapper INotifyPropertyChanged然后添加代码来动态更改语言:
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();
}
这适用于xaml文件中引用/绑定的资源(即MainPage框架),但它不会更新我在代码中声明的任何内容的引用,即
InfoLabel.Content = ApplicationStrings.SomeString
目前我没有使用ResourceWrapper。我的问题是如何更改我的代码,以便在ResourceWrapper更改时使用它并进行更新。我试过了:
InfoLabel.Content = ((ResourceWrapper)App.Current.Resources["ResourceWrapper"])
.ApplicationStrings.SomeString
但它不起作用。
有什么想法吗?
答案 0 :(得分:2)
您必须在代码中创建Binding。像这样:
var b = new Binding("SomeString");
b.Source = ((ResourceWrapper)App.Current.Resources["ResourceWrapper"]).ApplicationStrings;
b.Mode = BindingMode.OneWay;
InfoLabel.SetBinding(ContentControl.ContentProperty, b);
请记住,您绑定的类必须实现INotifyPropertyChanged
。
修改强>
如果您担心代码量,只需在应用程序的某处创建一个帮助方法:
public Binding GetResourceBinding(string key)
{
var b = new Binding(key);
b.Source = ((ResourceWrapper)App.Current.Resources["ResourceWrapper"]).ApplicationStrings;
b.Mode = BindingMode.OneWay;
return b;
}
然后使用这样的辅助方法:
InfoLabel.SetBinding(ContentControl.ContentProperty, GetResourceBinding("SomeString"));