Локализация в Silverlight 4 с использованием ResourceWrapper - PullRequest
5 голосов
/ 28 апреля 2010

У меня есть бизнес-приложение (созданное из шаблона), и я могу динамически менять язык, сделав 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

но это не работает.

Есть идеи?

1 Ответ

2 голосов
/ 28 апреля 2010

Вы должны создать привязку в коде. Примерно так:

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

Помните, что класс, к которому вы привязываетесь, должен реализовывать INotifyPropertyChanged.



EDIT: Если вас беспокоит объем кода, просто создайте вспомогательный метод где-нибудь в вашем приложении:

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"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...