WPF переоценивает триггеры стиля
Мое приложение поддерживает локализацию на английском и испанском языках. У меня есть текстовая метка, которая в зависимости от свойства Age применяет разные стили. Например, если Локализация установлена на английский:
Если Возраст < 18 -> Текст = Под возрастом [в красном цвете]
Если Возраст> 18 -> Текст = По возрасту [зеленым цветом]
Если Возраст == 18 -> Текст = На восемнадцать [в цвете синий]
Это работает нормально с этим кодом:
<TextBlock Margin="5,0,0,0">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Age,
Converter={StaticResource CuttoffConverter}, ConverterParameter=18}"
Value="False">
<Setter Property="Text" Value="{Loc strUnderAge}"/>
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Age,
Converter={StaticResource CuttoffConverter}, ConverterParameter=18}"
Value="True">
<Setter Property="Text" Value="{Loc strOverAge}"/>
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding Age}" Value="18">
<Setter Property="Text" Value="{Loc strOnEighteen}"/>
<Setter Property="Foreground" Value="Blue"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Часть локализации покрыта тегом {Loc XXXXXX} и работает нормально, за исключением следующего: если язык изменяется "в эфире", свойства этого DataTrigger Setter не пересматриваются, поэтому метки по-прежнему отображаются на английском языке.
Есть ли способ заставить переоценить?
ОБНОВИТЬ:
Я обновил свою библиотеку локализации до этой: WPF Localization Advanced, которая теперь поддерживает стили. Однако теперь он ломается при компиляции вышеуказанного кода XAML. Ошибка говорит:
"LocExtension недопустимо для Setter.Value. Единственными поддерживаемыми типами MarkupExtension являются DynamicResoruceExtension и BindingBase или производные типы."
Есть ли способ достичь той же цели, что я сделал с триггером, но с помощью любого из поддерживаемых методов LocExtension?
1 ответ
определять
strUnderAge
как свойство в классе, который реализуетINotifyPropertyChanged
Интерфейс.привязать курок к
strUnderAge
имущество.когда вы меняете язык, поднимите
PropertyChanged
событие.
В противном случае триггер не может знать, что язык изменился.