WPF Runtime Gebietsschema ändern, ValueConverter UI neu bewerten

8

In einer großen WPF-Anwendung haben wir die Möglichkeit, die Sprache zur Laufzeit zu ändern. Wir verwenden WPF Localize Extension und resx-Dateien für die Lokalisierung und es funktioniert super, außer für die in UI verwendeten Konverter. Wenn in einer Bindung ein ValueConverter kulturspezifisch ist, wird der resultierende Text bei der Sprachänderung nicht aktualisiert.

Wie kann ich WPF veranlassen, alle konvertierten Bindungen anwendungsweit zu aktualisieren?

EDIT: Im Moment haben wir experimentiert, indem wir die ValueConverter-MultiValueConverter erstellt und das Gebietsschema als zusätzlichen Wert hinzugefügt haben. Auf diese Weise ändern sich die Wertquellenwerte und das Ergebnis wird aktualisiert. Aber das ist umständlich und hässlich.

%Vor%

Related: Laufzeit-Kulturwechsel und IValueConverter in einer Bindung (Ich habe keine Möglichkeit, die Eigenschaft für jedes Feld manuell zu ändern)

    
Bjorn 15.05.2017, 08:28
quelle

2 Antworten

5

Als Option können Sie eine Wrapper-Markup-Erweiterung um Binding wie folgt erstellen:

%Vor%

Verwenden Sie so:

%Vor%

Sie können eine beliebige Bindung angeben (einschließlich MultiBinding ) und eine beliebige Eigenschaft verwenden, bei der die Bindung angewendet werden kann.

Wenn Sie der Meinung sind, dass dies sogar zu ausführlich ist, können Sie die Bindung auf andere Weise umbrechen, indem Sie alle Eigenschaften der Binding-Klasse spiegeln, die Sie für Ihre Markuperweiterung benötigen, und sie an die darunter liegende Bindung weiterleiten. In diesem Fall müssen Sie etwas mehr Code schreiben, und Sie müssen separate Klassen für Binding und MultiBinding haben (falls Sie auch MultiBinding benötigen). Der beste Weg wäre, von Binding zu erben und seine ProvideValue zu überschreiben, aber es ist nicht virtuell, also nicht möglich, und ich habe keine anderen Methoden gefunden, die Sie überschreiben können, um das Ergebnis zu erzielen. Hier ist eine Skizze mit nur 2 Eigenschaften der Bindung:

%Vor%

Dann wird die Verwendung vereinfacht:

%Vor%

Sie können weitere Eigenschaften (wie Mode usw.) nach Bedarf hinzufügen.

    
Evk 17.05.2017, 20:01
quelle
3

Das ist unsere Lösung. Ich hoffe, ich habe dein Problem verstanden, das du ändern möchtest, zum Beispiel DateTime ?

Das Converter ist ein einfaches IValueConverter , das den Wert in die aktuelle Sprache konvertiert. Translator ist eine statische Klasse, die (zum Beispiel) CurrentLanguage ( en-en / de-de ) als string enthält.

Das Behavior wird benötigt, um die Bindungen zu aktualisieren, wenn sich die Sprache geändert hat. Wir brauchen diese Implementierung nur 3-4 mal im Programm, weil es nur für die DateTime Formatierung ist. Alle anderen Texte werden in einer dynamischen Ressource gehalten.

Aber ich denke, für Ihre Bedürfnisse ist das Behavior das Richtige.

Konverter

%Vor%

Verhalten

%Vor%

XAML

%Vor%

Vorschau

    
Dominic Jonas 17.05.2017 13:02
quelle