簡體   English   中英

運行時文化更改和IValueConverter綁定

[英]Run-time culture change and IValueConverter in a binding

我正在處理的應用程序可以選擇切換界面語言。 這樣可以成功更改大多數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認為沒有理由對其進行更新。

在文化改變時進行更新的“正確”方法是什么?

我已經通過向基礎模型添加新方法解決了此問題。 由於我使用的是Livet並且模型是NotificationObject的后代,因此我向有問題的模型添加了新的公共方法Update()

this.RaisePropertyChanged("changed_property_name_here");

並添加

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

給文化變革管理者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM