2016-03-29 2 views
0

In C# habe ich eine Eigenschaft hinzugefügt, die eine Liste von Tupeln für eine Dropdown-Auswahlbox zurückgibt. Die Liste enthält Zeichenfolgen aus Ressourcendateien. Bei einer Sprachänderung wird der Wert in der Liste aktualisiert. Beim Aufrufen der Eigenschaft wird der zurückgegebene Wert jedoch nicht aktualisiert.Aktualisieren einer privaten List-Variablen bei Sprachänderung MVVM und XAML

Unten ist der Code

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

Dies ist, wie ich die Tupel-Wert (ein keyvalue Paar mit lcid und Sprachname)

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

Auf Sprache Update werden die Ressourcen-Strings nehmen die aufrufen übersetzter Wert. Die Eigenschaft LanguageList gibt jedoch eine veraltete Liste zurück, die beim Start der App zuerst initialisiert wurde.

Haben Sie Vorschläge, wie ich diese Liste bei Sprachänderungen aktualisieren kann?

Vielen Dank im Voraus.

+0

Sie müssen benachrichtigt werden Eigenschaft hat sich geändert? –

+0

Alles sieht korrekt aus, aber dein Problem ist unklar. Sie sagen "Aber die Eigenschaft LanguageList gibt eine veraltete Liste zurück, die beim Start der App zuerst initialisiert wurde", dies erscheint vollständig wie erwartet und korrekt. Warum müssten Sie diese Liste ändern? Und wenn Sie es * ändern * müssen, bitte [bearbeiten] und spezifizieren Sie ** genau, welche Änderungen Sie vornehmen müssen **. Ich könnte annehmen, dass Sie die ausgewählte Sprache entfernen möchten (keine Notwendigkeit, es als eine Option aufzulisten), in welchem ​​Fall Sie eine ObservableCollection verwenden sollten, aber das ist wirklich unnötig, also werde ich das nicht annehmen. – Will

+0

Danke für die Vorschläge. Beim Auswählen einer Sprache aus der Liste würde ich die Ressourcendateien so umstellen, dass sie der gewählten Sprache entsprechen. Es übersetzt die gesamte Anwendung, aber diese Liste. Die App-Ressourcenreferenzen spiegeln die aktualisierten Sprachübersetzungen wider.Aber die Eigenschaft LanguageList gibt den übersetzten _languageList-Wert nicht zurück. Es gibt vielmehr den Standardwert (Englisch) zurück. – Sriram

Antwort

0

Sie können so etwas wie dieses

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

Dann versuchen Sie Ihr ListView.ItemsSource an Sprachen binden.

Möchten Sie die erste erhalten? Machen Sie es gleich:

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

Worth einfach hier läuten. Ich hasse Tuples ... so sehr. Ist eine Klasse so schwierig?

Ich hoffe, das hilft. Viel Glück!

+0

Danke für den Vorschlag Jerry. Ich habe bereits eine Abkürzung gemacht, die für mich funktionierte, ohne viel in der Code-Ebene zu ändern. Ich füge meinen Fix unten als Antwort hinzu. – Sriram

0

Die Fehlerbehebung, die ich für dieses Problem hatte, ist das unten stehende Code-Update. ich eine neue Funktion, wie unten

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

und rief die Funktion, bevor meine LINQ-Anweisung

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

Aktualisieren die _languageList durch Zuordnung die gleiche Liste von Tupeln wieder mit den gleichen Daten hinzugefügt, aktualisiert die Liste mit übersetzter Text Daher gibt die Eigenschaft LanguageList den richtigen Wert zurück.

Das ist offensichtlich eine schmutzige Lösung. Aber das hat mit meiner Anforderung gut funktioniert.