2016-03-29 12 views
0

在C#中,我添加了一個屬性,該屬性返回下拉選擇框的元組列表。該列表包含來自資源文件的字符串。在語言更改時,列表中的值正在更新。但是,當調用該屬性時,返回的值不會刷新。刷新語言變化MVVM和XAML上的私有列表變量

下面是代碼

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返回一個過時的列表,該列表在應用程序啓動時首先被初始化。

有關如何在語言更改時刷新此列表的任何建議?

在此先感謝。

+0

您需要通知屬性已更改? –

+0

一切看起來都正確,但你的問題不清楚。你說:「但是,當應用程序啓動時,屬性LanguageList返回一個已經初始化的廢棄列表」,這完全按預期顯示並且是正確的。爲什麼你需要改變這個列表?而且,如果您*需要*需要更改它,請[編輯]並指定**確切需要做出哪些更改**。我可以假設你想刪除選定的語言(不需要列出它作爲選項),在這種情況下,你應該使用ObservableCollection,但這是真的不必要的,所以我不會假設。 – Will

+0

感謝您的建議。在從列表中選擇語言時,我會切換資源文件以匹配所選語言。它正在翻譯整個應用程序,但是這個列表。應用程序資源參考反映了更新的語言翻譯。但是屬性LanguageList沒有返回已翻譯的_languageList值。相反,它是返回默認值(這是英語)。 – Sriram

回答

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]; 

價值只有在這裏鳴響。我討厭Tuples ...太多了。是一堂課如此困難?

我希望這會有所幫助。祝你好運!

+0

謝謝傑裏的建議。我已經做了一個捷徑,在代碼級別上沒有太多變化。我將在下面添加我的修復作爲答案。 – Sriram

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呈現正確的值。

這顯然是一個骯髒的修復。但是這符合我的要求。