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)
Als Option können Sie eine Wrapper-Markup-Erweiterung um Binding
wie folgt erstellen:
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:
Dann wird die Verwendung vereinfacht:
%Vor% Sie können weitere Eigenschaften (wie Mode
usw.) nach Bedarf hinzufügen.
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.
Tags und Links wpf c# data-binding converter localization