Laden...

Warum ist String in Währung formatieren im XAML anders als im ViewModel?

Erstellt von CoderboyPB vor 3 Jahren Letzter Beitrag vor 3 Jahren 595 Views
C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 3 Jahren
Warum ist String in Währung formatieren im XAML anders als im ViewModel?

Hallo, wenn ich die Zahl (Decimal) wie folgt konvertiere


<TextBlock Text="{Binding RetailPrice, StringFormat='{}{0:C}'}" />

erhalte ich eine amerikanische Preisangabe mit einem Dollarzeichen vor dem Betrag.

Füge ich aber dem Display Model eine Property, wie folgt zu


public string RetailPriceDisplay
        {
            get => RetailPrice.ToString("C");
        }

und binde den TextBlock auf diese Property OHNE StringFormat Attribut, dann bekomme ich die Ausgabe in € (mit Euro Zeichen hinter dem Betrag)

So, und jetzt die alles entscheidende Frage:
WARUM ist das so? Warum werden hier verschiedene Cultures verwendet?
(Die XAML Formatierung habe ich aus einem amerikanischen Video)

S
248 Beiträge seit 2008
vor 3 Jahren

Hallo,

siehe Hinweise von Binding.ConverterCulture Eigenschaft.

Edit:
Du hast fast die gleiche Frage schonmal gestellt und eine Antwort bekommen, wie man diese umstellt.
Vielleicht sollte man mit klarem Kopf und ausgeschlafen an die Sache rangehen 😉

Grüße spooky

C
CoderboyPB Themenstarter:in
327 Beiträge seit 2008
vor 3 Jahren

Ausgeschlafen war ich fast, aber auch wenn ich noch zu 100 % wach gewesen wäre, wäre ich im Leben nicht drauf gekommen, dass .NET in der String Formatierung die eingestellte Culture benutzt, während dessen bei der XAML Formatierung per default us-eng benutzt wird, anstatt die, die auf meinem Rechner eingestellt ist ...

Das erinnert mich an Corona und den - nach heutigen Erkenntnissen - unnötigen Lockdown:
Sowas muss man erst wissen, bevor man es richtig macht.){gray}

Ich danke dir an dieser Stelle, dass du mich in dieses Wissen eingeweiht, und mir dieses Mysterium erklärt hast. 🙂

2.078 Beiträge seit 2012
vor 3 Jahren

Das hängt damit zusammen, dass Du in WPF getrennt nochmal die Sprache einstellen kannst, dafür gibt es die Language-Property.
Ich vermute, das hat den Hintergrund, dass man Logik und UI trennen will, denn die Logik könnte die statischen Properties (CurrentCulture und CurrentUICulture) an der CultureInfo ändern, was ebenfalls zu potentiell ungewollten Änderungen der UI führen würde.

Man könnte einmal im Window im Konstruktor folgendes machen:

Language = XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.IetfLanguageTag);

Das sollte dann global für alles andere gelten

S
248 Beiträge seit 2008
vor 3 Jahren

Oder, falls gewünscht global, mit diesem Code (siehe auch verlinkter Post):

            FrameworkElement.LanguageProperty.OverrideMetadata(
                typeof(FrameworkElement),
                new FrameworkPropertyMetadata(
                    XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

Kannst du z.B. im Ctor/OnStartup deiner Application-Klasse aufrufen.

Grüße