WPF: Dynamic MarkupExtension - повторный рендеринг / обновление значения - PullRequest
6 голосов
/ 14 июня 2009

Я использую разметку для загрузки интернационализированных строк в приложении WPF следующим образом:

<Button Content="{Translate MyText}"/>

Мой markupextension называется «TranslateExtension», и он ищет значение для ключа «MyText» из базы данных. Это делает в

ProvideValue(IServiceProvider serviceProvider)

метод, который возвращает правильную строку. Все работает нормально.

Моя проблема в том, что метод ProvideValue больше никогда не вызывается, и при смене языка невозможно извлечь новую строку из базы данных. Теперь мне нужен способ сделать возвращаемое значение «динамическим», заставить Button перезагружать его xaml и повторно использовать markupextension, независимо от того, произойдет ли это через событие, выброшенное при смене языка или что-то еще. Как мне заставить систему снова вызывать метод ProvideValue? Я попробовал такие InvalidateVisual () InvalidateArrange () InvalidateMeasure () UpdateLayout () ...

Надеюсь, я ясно дал понять. Пожалуйста, не стесняйтесь спрашивать больше информации о том, что, по вашему мнению, вы способны предложить идеи или решения. Спасибо

Ответы [ 2 ]

4 голосов
/ 03 августа 2011

Ну, решение довольно простая идея.

ProvideValue вызывается только один раз, но параметр serviceProvider предоставляет вам также экземпляр объекта и свойство (PropertyInfo). Это все, что вам нужно, чтобы обновить это свойство позже.

Я бы сделал статическое событие в App.cs, скажем, CultureChanged; В методе ProvideValue получите экземпляр объекта и свойство и сохраните их. прикрепить к событию CultureChanged и в его EventHandler установить значение свойства с помощью отражения. вот и все, просто будь осторожен с утечками памяти.

Существует MarkupExtension, который использует этот подход и позволяет кэшировать культуру на лету: http://www.codeproject.com/KB/WPF/WpfMultiLanguage.aspx

0 голосов
/ 14 июня 2009

У меня нет ответа для вас, а скорее предложение ...

Возможно, вы могли бы рассмотреть возможность использования Binding в сочетании с IValueConverter для выполнения перевода. Затем, если язык пользовательского интерфейса изменится, вы можете просто восстановить все привязки и обновить их.

Как я уже сказал, просто идея.

...