Я работаю в Намибии. Намибия не является опцией в настройках региона и языка Windows, но делится большинством культурных особенностей с Южной Африкой, поэтому мы выбираем английский язык Южная Африка, а затем настраиваем символ валюты на «N $» (намибийские доллары) а не "R" (южноафриканский рэнд).
Однако я не могу убедить WPF использовать настроенную валюту. Использование string.format("{0:c}", foo)
в коде работает нормально, но использование {Binding Path=SomeCurrencyValue, StringFormat=c
} `в XAML по-прежнему использует символ« R », а не пользовательский символ« N $ ».
В App.xaml.cs
Я установил прикладную культуру со следующим кодом:
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.LCID, true);
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
new FrameworkPropertyMetadata(
System.Windows.Markup.XmlLanguage.GetLanguage(
System.Globalization.CultureInfo.CurrentUICulture.IetfLanguageTag)));
В качестве демонстрации приведем код XAML, который показывает проблему:
<StackPanel>
<TextBlock>
Formatted in XAML with: <LineBreak/>
Text="{Binding Path=SomeCurrencyValue, StringFormat=c}" <LineBreak/>
Result:
</TextBlock>
<TextBox Text="{Binding Path=SomeCurrencyValue, StringFormat=c, Mode=OneWay}"
Margin="5"/>
<TextBlock>
Formatted in code with: <LineBreak/>
return string.Format("{0:c}", SomeCurrencyValue); <LineBreak/>
Result:
</TextBlock>
<TextBox Text="{Binding Path=SomeCurrencyString, Mode=OneWay}"
Margin="5"/>
</StackPanel>
DataContext
для указанного выше представления содержит следующее:
public double SomeCurrencyValue
{
get { return 34.95; }
}
public string SomeCurrencyString
{
get
{
return string.Format("{0:c}", SomeCurrencyValue);
}
}
И результат выглядит так:
Я знаю, что есть похожий вопрос здесь , но я надеялся получить лучшие ответы с более полным вопросом. Я в основном работаю над финансовыми приложениями для намибийских клиентов, так что это довольно серьезная проблема для меня - если нет способа сделать это с .NET 4.0, я бы рассмотрел вопрос об отчете об ошибке, но я просто хотел сначала проверить здесь .
EDIT:
Просто открыл награду за этот вопрос. Я надеюсь либо на решение, которое не является нелепым обходным путем, либо на подтверждение того, что это ошибка и ее следует подавать как таковой.