0

在 C# 中,我添加了一个属性,该属性返回一个下拉选择框的元组列表。该列表包含来自资源文件的字符串。在语言更改时,列表中的值会更新。但是在调用属性时,返回的值不会被刷新。

下面是代码

    private List<Tuple<string, string>> _languageList = new List<Tuple<string, string>>
    {
       new Tuple<string, string>("", AppResources.Automatic),
       new Tuple<string, string>("0407", AppResources.LanguageGerman),
       new Tuple<string, string>("0809", AppResources.LanguageUKEnglish),
       new Tuple<string, string>("0409", AppResources.LanguageUSEnglish),
       new Tuple<string, string>("0c0a", AppResources.LanguageSpanish),
       new Tuple<string, string>("0c0c", AppResources.LanguageFrenchCanadian),
       new Tuple<string, string>("040c", AppResources.LanguageFrench),
       new Tuple<string, string>("0413", AppResources.LanguageDutch)
    };

    public List<Tuple<string, string>> LanguageList
    {
          get
          {
               return _languageList;
          }
    }

这就是我调用元组值的方式(带有 lcid 和语言名称的键值对)

SelectedLanguage = LanguageList.FirstOrDefault(q => q.Item1 == CurrentSettings.SelectedLanguage) ?? LanguageList[0];

在语言更新时,资源字符串采用翻译后的值。但是属性 LanguageList 返回一个过时的列表,该列表在应用程序启动时首先被初始化。

关于如何刷新此语言更改列表的任何建议?

提前致谢。

4

2 回答 2

0

我对这个问题的修复是下面的代码更新。我添加了一个新功能如下

public void refreshLanguageList() {
  _languageList = new List<Tuple<string, string>>
    {
       new Tuple<string, string>("", AppResources.Automatic),
       new Tuple<string, string>("0407", AppResources.LanguageGerman),
       new Tuple<string, string>("0809", AppResources.LanguageUKEnglish),
       new Tuple<string, string>("0409", AppResources.LanguageUSEnglish),
       new Tuple<string, string>("0c0a", AppResources.LanguageSpanish),
       new Tuple<string, string>("0c0c", AppResources.LanguageFrenchCanadian),
       new Tuple<string, string>("040c", AppResources.LanguageFrench),
       new Tuple<string, string>("0413", AppResources.LanguageDutch)
    };
}

并在我的 LINQ 语句之前调用该函数

refreshLanguageList();
SelectedLanguage = Languages
  .FirstOrDefault(q => q.Item1 == CurrentSettings.SelectedLanguage) ?? LanguageList[0];

通过使用相同的数据再次分配相同的元组列表来刷新_languageList,使用翻译的文本更新列表。因此属性 LanguageList 呈现正确的值。

这显然是一个肮脏的修复。但这符合我的要求。

于 2016-04-01T09:29:07.187 回答
0

你可以试试这样的

class Language {
  public string Code { get; set; }
  public string Name { get; set; }
}

void LanguageChangeHandler(sender, args) {

   // never overwrite the property       
   Languages.Clear();

   var languages = args.NewLanguages: // or whatever you do 
   foreach (var language in languages) {
     Languages.Add(language);
   }
};

public ObservableCollection<Language> Languages { get; } 
  = new ObservableCollection<Language>();

然后将您的 ListView.ItemsSource 绑定到语言。

想抢第一?做同样的事情:

SelectedLanguage = Languages
  .FirstOrDefault(q => q.Item1 == CurrentSettings.SelectedLanguage) ?? LanguageList[0];

值得在这里插话。我讨厌元组……非常讨厌。上课有那么难吗?

我希望这有帮助。祝你好运!

于 2016-03-31T20:43:35.893 回答