我正在处理的应用程序可以选择切换界面语言。这成功地改变了大多数UI本身,例如,
<Run Text="{Binding Resources.CreditsTitle, Source={x:Static models:ResourceService.Current}, Mode=OneWay}" />
除了静态UI元素之外,还有一些显示了一些模型的属性;对于他们中的大多数人来说,没有必要进行本地化,除了一个(现在)。模型来自解决方案中的不同项目,并且是只读的。需要以其本地化形式显示的一个属性由其在模型中的ID表示,我为其编写了一个返回Resource字符串的转换器。
public class RankIDToRankNameConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is int)
{
var ID = (int)value;
switch (ID)
{
case 1:
return Resources.Rank_Expert;
case 2:
return Resources.Rank_Intermediate;
等等。
在XAML文档中,它被绑定为
<Run Text="{Binding Model.RankID, Converter={StaticResource RankIDToRankNameConverterKey}, Mode=OneWay}"
Style="{DynamicResource PickupTextElementStyleKey}"
FontSize="14" />
...它可以工作,但只有一次,当UI元素第一次被绘制时(显然它也可以在RankID属性发生变化但很少发生时)。当文化发生变化时,它不会改变。我猜这是因为属性更改事件不会触发,因此WPF认为没有理由更新它。
当文化发生变化时,让它更新的“正确”方法是什么?
答案 0 :(得分:0)
我通过向底层模型添加新方法解决了这个问题。由于我使用的是Livet,而模型是NotificationObject的后代,我向所讨论的模型添加了一个新的公共方法Update()
this.RaisePropertyChanged("changed_property_name_here");
并添加
try
{
InstanceOfModelStorage.UnderlyingModel.Update();
}
catch (NullReferenceException e) { }
到文化变革处理程序。