Обновление пользовательской привязки WPF для RaisePropertyChange () - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть код для локализации языка.Он основан на подходе XML, который сначала читает некоторые файлы XML во время запуска приложения и заполняет словарь строками ключа / значения для текущего языка.Он также заполняет список, содержащий XAML, описывающий каждый флаг языка.

Все это прекрасно работает, я могу показать все загруженные флаги XAML, изменить язык, щелкнув флаг, и мой объект LocalizationManager (обработка словаря) может перевести любой ключдля локализованной строки для меня.Пока все хорошо.

Но ... Я использую MVVM (MVVMLight), и когда я читаю о локализации и MVVM, большинство / многие люди склонны считать, что локализация должна обрабатываться представлением.Я нахожу код позади, чтобы нарушить концепцию MVVM в этом случае, и очевидно, что наличие свойства на виртуальной машине для каждой строки в представлении, к которому нужно привязаться, - это то, чего я действительно хотел бы избежать (это, кстати, уже отлично работает).

Итак, я попробовал собственный класс привязки, который я называю TranslateBinding.Это очень просто.

class TranslateBinding : System.Windows.Data.Binding
    {
        public TranslateBinding(string key) : base()
        {
            Converter = new TranslationConverter(key);
        }
    }

Хитрость в том, что я не пересылаю строковый ключ (путь привязки) в базовый ctor.Я установил конвертер привязки в пользовательский объект TranslationConverter и вместо этого передал ключ к нему.Класс TranslationConverter будет хранить ключ локально, и для каждого обновления привязки конвертер будет просто использовать ключ для возврата локализованной строки из моего LocalizationManager на основе текущего установленного языка.

Этот подход означает, что я могуВыполните локализацию / перевод полностью из XAML очень чистым и коротким способом.Код XAML будет выглядеть следующим образом, где «Move» будет ключом для перевода на местный язык.

<Label Content="{loc:TranslateBinding Move}"/> 

Это работает, но единственная проблема, с которой я столкнулся сейчас, заключается в том, что TranslateBinding не обновляется немедленно, когдаЯ звоню RaisePropertyChanged(null)

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

Так что мой вопросПроще говоря, как заставить принудительно обновить привязку TranslationBinding при вызове RaisePropertyChanged(null)?Я хочу, чтобы все привязки немедленно обновлялись, чтобы получить новые локализованные значения, когда язык изменился.

1 Ответ

0 голосов
/ 04 декабря 2018

Кажется, мне просто нужно было сформулировать вопрос, чтобы найти ответ.Я только что добавил свойство фиктивной строки в LocalizationManager.Затем я установил источник TranslationBinding для LocalizationManager, а его путь для свойства фиктивной строки.Тогда было достаточно вызвать RaisePropertyChanged (nameof (DummyString)) в LocalizationManager, как только изменился язык.

Теперь локализация может быть полностью выполнена из XAML без лишних сложностей при наборе текста по сравнению с «обычным»привязка к ВМ.

<Label Content="{loc:TranslateBinding Move}"/> 
...