运行时文化更改和IValueConverter绑定

时间:2014-06-01 17:16:57

标签: c# .net wpf xaml

我正在处理的应用程序可以选择切换界面语言。这成功地改变了大多数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认为没有理由更新它。

当文化发生变化时,让它更新的“正确”方法是什么?

1 个答案:

答案 0 :(得分:0)

我通过向底层模型添加新方法解决了这个问题。由于我使用的是Livet,而模型是NotificationObject的后代,我向所讨论的模型添加了一个新的公共方法Update()

this.RaisePropertyChanged("changed_property_name_here");

并添加

try
{
    InstanceOfModelStorage.UnderlyingModel.Update();
}
catch (NullReferenceException e) { }

到文化变革处理程序。