Kurz zur Ausgangslage:
Ich habe in meinem Projekt eine statische MultiLanguage-Klasse.
Spoiler anzeigen
Die Klasse hat eine Property
In der GUI soll nun das Event abonniert werden und je nach Sprache die Texte angepasst werden. In der richtigen Anwendung ist das mit einem ResourceManager realisiert, welcher dann je nach Sprache in einer entsprechenden .resx-Datei Einträge auswählt.
Ich habe meine UI-Elemente an diverse Properties gebunden und teilweise einen Converter für die MultiLanguage-Thematik verwendet.
Spoiler anzeigen
Das funktioniert auch alles soweit...jetzt bin ich allerdings auf ein komisches Verhalten gestoßen.
Wenn von einem TextBlock die Text-Property an eine DependencyProperty in meinem Control gebunden ist und ich bei gefeuertem LanguageChanged-Event
Abonnieren des LanguageChanged-Events im Control:
Properties im Control/Window:
Und Binding im UI:
Im Anhang hab ich das ganze nochmal beispielhaft als Solution.
Als "Lösung" habe ich bis jetzt im Netz nur gefunden, im XAML dem entsprechenden Control einen Namen mit z.B.
Das finde ich aber irgendwie nicht so geil muss ich sagen, gibt's da noch andere Lösungen oder mach ich was falsch?
Danke für eure Hilfe.
Ich habe in meinem Projekt eine statische MultiLanguage-Klasse.
C#-Quellcode
- public static class MultiLanguage
- {
- public enum Languages { German, English }
- public static event EventHandler<Languages> LanguageChanged;
- public static Languages Language
- {
- get => _language;
- set
- {
- if (_language != value)
- {
- _language = value;
- LanguageChanged?.Invoke(null, _language);
- }
- }
- }
- private static Languages _language;
- }
Die Klasse hat eine Property
Language
, welche die aktuell gewählte Sprache beinhaltet. Ändert sich die Sprache, wird ein Event LanguageChanged
gefeuert.In der GUI soll nun das Event abonniert werden und je nach Sprache die Texte angepasst werden. In der richtigen Anwendung ist das mit einem ResourceManager realisiert, welcher dann je nach Sprache in einer entsprechenden .resx-Datei Einträge auswählt.
Ich habe meine UI-Elemente an diverse Properties gebunden und teilweise einen Converter für die MultiLanguage-Thematik verwendet.
C#-Quellcode
- public sealed class MeinConverter : IValueConverter
- {
- public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
- {
- if (value?.GetType() != typeof(int))
- return null;
- switch (MultiLanguage.Language)
- {
- case MultiLanguage.Languages.German:
- return "deutscher wert";
- case MultiLanguage.Languages.English:
- return "english value";
- default:
- return "ungültige sprache";
- }
- }
- public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
- {
- throw new NotImplementedException();
- }
- }
Das funktioniert auch alles soweit...jetzt bin ich allerdings auf ein komisches Verhalten gestoßen.
Wenn von einem TextBlock die Text-Property an eine DependencyProperty in meinem Control gebunden ist und ich bei gefeuertem LanguageChanged-Event
RaisePropertyChanged()
aufrufe, komme ich nicht in meinen verwendeten Converter rein. Bei "normalen" Properties funktioniert das aber nach wie vor tadellos.Abonnieren des LanguageChanged-Events im Control:
Properties im Control/Window:
C#-Quellcode
- public static readonly DependencyProperty NumbersDPProperty =
- DependencyProperty.Register(nameof(NumbersDP), typeof(ObservableCollection<int>), typeof(MainWindow), new PropertyMetadata(new ObservableCollection<int>()));
- public ObservableCollection<int> NumbersDP { get => (ObservableCollection<int>)GetValue(NumbersDPProperty); set => SetValue(NumbersDPProperty, value); }
- public ObservableCollection<int> NumbersNormal { get; } = new ObservableCollection<int>();
Und Binding im UI:
Im Anhang hab ich das ganze nochmal beispielhaft als Solution.
Als "Lösung" habe ich bis jetzt im Netz nur gefunden, im XAML dem entsprechenden Control einen Namen mit z.B.
x:Name="TxtDP"
geben und dann im Code-Behind TxtDP.GetBindingExpression(TextBlock.TextProperty).UpdateTarget();
aufrufen, wenn LanguageChanged gefeuert wurde.Das finde ich aber irgendwie nicht so geil muss ich sagen, gibt's da noch andere Lösungen oder mach ich was falsch?
Danke für eure Hilfe.