none
Sprach Einstellungen z.B. Zahlentrennzeichen werden in Bindings ignoriert. RRS feed

  • Frage

  • Hallo,
    gibt es in WPF eine Moeglichkeit dass Bindings, die einen Default Converter verwenden z.B. <TextBlock Text="{Binding DobuleValue}"/> die im Control Panel eingestellten Sprach Optionen z.B. fuer Deutsch (Deutsch) Zahlentrennzeichen auf "." anstatt ",", verwenden.
    Die in diversen Foren angebotene Loesung:
    FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage("de-de")));
    verwendet leider immer die default Einstellungen, da  die verwendete CultureInfo immer mit false als UseUserOverride initialisiert wird (new CultureInfo(name, false))

    PS:
    XmlLanguage.GetLanguage verhaelt sich auch im 4.0er Framework so.
     
    Dienstag, 24. November 2009 08:20

Alle Antworten

  • Dienstag, 24. November 2009 08:45
    Moderator
  • Hallo Robert,

    Danke fuer die Antwort. Auf die von Dir angegebenen Links bin ich auch schon gestossen. Sie helfen mir aber nicht wirklich weiter. Man kann zwar das Binding zwingen, die richtige CultureInfo zu waehlen, aber initialisiert wird die CultureInfo halt immer mit UseUserOverride=false.
    Folgender Code zeigt den Unterschied:

                CultureInfo cultureInfodede = new CultureInfo("de-de");
                Thread.CurrentThread.CurrentUICulture = cultureInfodede;
                Thread.CurrentThread.CurrentCulture = cultureInfodede;

                XmlLanguage xmlLanguage = XmlLanguage.GetLanguage(cultureInfodede.IetfLanguageTag);
                CultureInfo specificCulture = xmlLanguage.GetSpecificCulture();
                CultureInfo equivalentCulture = xmlLanguage.GetEquivalentCulture();
                bool useUserOverride = cultureInfodede.UseUserOverride;
                bool useUserOverride = specificCulture.UseUserOverride;
                bool useUserOverride = equivalentCulture.UseUserOverride;

    Die einzige mir bekannt Loesung besteht darin, fuer jedes Binding einen Converter anzugeben z.B. <TextBlock Text="{Binding DobuleValue,Converter={StaticResource myConverter}}"/> dies will ich aber vermeiden, da es immer wieder nachlaessige Entwickler gibt, die nicht daran denken oder auch Komponenten von externen die sich in unsere Anwendung per add-in einbinden. Leider hat auch XmlLanguage keinen public Constructor d.h. ich kann auch nichts eigenes implementieren.
    Ist mein Problem jetzt klar?

    Mittwoch, 25. November 2009 10:02
  • Hallo Roland,

    Sehr klar. Eigentlich hast Du Recht. Dass mit dem Converter für jedes Binding habe ich auch gefunden (http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/d872bc56-2c49-490b-8cdf-00b2d0e2a0d6 und http://social.msdn.microsoft.com/Forums/en-US/clr/thread/07a53d9a-49bb-48c8-b465-16a75218f289)

    Es wird noch vorgeschlagen den Versuch mit xml:Lang="de-de" auf den ersten Element in der XAML à http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/5907414a-13fd-49d4-95db-729e832de6dd

    Grüße,

    Robert

    Mittwoch, 25. November 2009 12:58
    Moderator
  • Hallo Robert,

    damit hatte ich es auch schon Versucht, hat aber auch nicht geklappt. Das Binding verwendet immer das XmlLanguage object das wiederum immer in der Implementierung von CultureInfo.GetCultureInfoByIetfLanguageTag landet. Diese wiederum erzeugt immer ein CultureInfo mit UseUseOverride=false. Naja, dann geht das scheinbar einfach nicht. Vielleicht in .Net 5.0 ;-(
    Mittwoch, 25. November 2009 15:58