2016-03-29 12 views
0

C#では、ドロップダウン選択ボックスのタプルのリストを返すプロパティを追加しました。このリストには、リソースファイルの文字列が含まれています。言語の変更については、リストの値が更新されています。しかし、プロパティーを呼び出すとき、戻り値はリフレッシュされません。以下言語変更のプライベートList変数の更新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; 
      } 
    } 

これは私が言語Updateでタプル値(LCIDと言語名でキー値ペア)

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

を呼び出す方法、リソース文字列を取っているあります翻訳された価値。しかし、プロパティLanguageListは、アプリケーションの起動時に最初に初期化された廃止リストを返します。

言語の変更についてこのリストを更新するにはどうすればよいですか?

ありがとうございます。

+0

プロパティが変更されたことを通知する必要がありますか? –

+0

すべてが正しいように見えますが、問題は不明です。あなたは "しかし、プロパティLanguageListは、アプリケーションの起動時に最初に初期化された古いリストを返す"と言っているが、これはまるで期待通りに正しく表示される。なぜあなたはこのリストを変更する必要がありますか?そして、あなたが変更する必要がある場合は、[編集]して**変更する必要のある変更を正確に**指定してください。選択した言語を削除したいと思うかもしれません(オプションとしてリストする必要はありません)。その場合はObservableCollectionを使用する必要がありますが、それは本当に不必要なので、私はそれを想定しません。 – Will

+0

提案していただきありがとうございます。リストから言語を選ぶと、選択した言語に合うようにリソースファイルが切り替わります。これはアプリケーション全体を翻訳していますが、このリストです。 Appリソース参照には、更新された言語の翻訳が反映されています。しかし、LanguageListプロパティは、変換された_languageList値を返していません。むしろ、デフォルト値(英語)を返しています。 – Sriram

答えて

0

あなたは、その後の言語にあなたのListView.ItemsSourceを結合し、この

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>(); 

ような何かを試すことができます。

最初にやりたいですか?それを同じ操作を行います:価値はちょうどここに鳴る

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

。私はタプルを嫌う...そんなに。クラスはとても難しいですか?

これが役立ちます。運が良かった!

+0

Jerryの提案に感謝します。私はすでにコードレベルであまり変化させずに私のために働くショートカットを作った。答えとして私の修正を追加します。 – 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文の_languageListを更新

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

前に関数を呼び出し、とのリストを更新翻訳されたテキスト。したがって、LanguageListプロパティは正しい値をレンダリングします。

これは明らかに汚れた修正です。しかし、それは私の要求とうまくいった。

関連する問題