Xamarin Forms - force-Steuerelement zu aktualisieren, mit dem Wert aus der Bindung

Angesichts der folgenden ViewModel...

public class NameEntryViewModel 
{
    public NameEntryViewModel()
    {
        Branding = new Dictionary<string, string>();

        Branding.Add("HeaderLabelText", "Welcome to the app");
    }

    public Dictionary<string, string> Branding { get; set; }
}

Gebunden an die Seite...

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Monaco.Forms.Views.NameEntryPage">

        <Label Text="{Binding Branding[HeaderLabelText]}" />

</ContentPage>

Wenn die Seite kommt das Label wird der text "Willkommen zu den app'. Dies funktioniert Super und passt in unseren plan für die Anpassung und globalisieren unsere app. Dann Branding Wörterbuch ist statisch festgelegt, in diesem Beispiel, aber in der realen Welt ist es initialisiert die Daten eines service-Aufruf.

Sollte jedoch den Benutzer wechseln möchten, die Sprache auf Spanisch, wir müssten jedes gebundene label zu aktualisieren, um den neuen Wert. Es ist leicht genug, um einen reset der Branding-Wörterbuch und füllen Sie es mit Spanisch übersetzungen, aber wie können wir die Kraft, die Steuerelemente zu aktualisieren, aus Ihren gebundenen Quellen?

Ich versuche zu vermeiden, zwei-Wege-Datenbindung hier b/c wir wollen nicht den code-overhead für das erzeugen von backing-Eigenschaft für jedes Text-Eigenschaft der Steuerelemente. Damit wir die Bindung an ein dictionary mit Werten.

ANTWORT

Akzeptierte ich die Antwort weiter unten, aber ich habe nicht verwenden eine traditionelle Eigenschaft setter. Stattdessen, wenn ein Benutzer möchte, dass Knebel eine andere Sprache, wir haben jetzt einen zentralen handler, der füllt ihn wieder auf unser Wörterbuch und benachrichtigt dann der Wechsel zu dem Wörterbuch. Wir sind mit MVVMCross, aber Sie können übersetzen, um standard-Formulare...

    public MvxCommand CultureCommand
    {
        get
        {
            return new MvxCommand(async () =>
            {
                _brandingService.ToggleCurrentCulture();
                await ApplyBranding(); //<-- this call repopulates the Branding property
                RaisePropertyChanged(() => Branding);
            });
        }
    }
  • Sie können erhöhen das PropertyChanged-Ereignis auf der Branding-Eigenschaft und es frischt alles, was bindet Branding oder jegliche Bindung mit Branding in den Weg.
Schreibe einen Kommentar