2009-06-13 2 views
4

Я вижу некорректное поведение из документов XAML при изменении CurrentCulture. Когда у меня есть некоторые элементы, как это в окне:WPF XAML Bindings and CurrentCulture Display

<Window x:Class="WpfLocalizationLocBaml.Test" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:glob="clr-namespace:System.Globalization;assembly=mscorlib" 
     x:Name="wndTest" 
    Title="Test" Height="300" Width="300"> 
    <StackPanel> 

     <TextBlock x:Name="lblCultureName" 
        Text="{Binding Source={x:Static glob:CultureInfo.CurrentCulture}, 
            Path=DisplayName}" /> 


     <TextBlock x:Name="lblLocaleDateValue" 
        Text="{Binding ElementName=wndTest, Path=TestDate}"/> 

     <TextBlock x:Name="lblLocaleNumberValue" 
        Text="{Binding ElementName=wndTest,Path=NumberValue,StringFormat=c}" /> 

    </StackPanel> 
</Window> 

, а также MessageBox.Show (NumberValue.ToString («с»)); когда начинается форма, я вижу разные результаты.

Если я запустил форму с языком по умолчанию, все это, очевидно, очевидно. Однако, если я изменяю культуру в коде или при запуске, привязки к дате и номерам по-прежнему показывают форматирование в США. Отображаемое значение MessageBox.Show() соответствующим образом отражает текущую культуру.

Вопрос: Действительно ли WPF не уважает CurrentCulture в привязках? И если да, то что именно определяет культуру, которая используется для привязок. В моем случае это явно en-US, но независимо от того, что я задал в своем проекте как язык по умолчанию, он всегда связывается в en-US.

Любые идеи оценили ...

ответ

18

Оказывается, что WPF не уважает CurrentCulture по умолчанию в переплетах, а вместо значения по умолчанию в XML: Lang настройка определена в XAML документе или ан-США, если не предусмотрено. Это довольно неутешительное поведение - не уверен, почему у вас не было бы автоматического форматирования культуры, применяемого как любая другая технология пользовательского интерфейса, но ...

К счастью, есть легкое обходное решение, которое может быть применено в конструкторе документа или базе Window/UserControl класс:

 // MAKE SURE you set the language of the page explicitly or else 
     // all number and date formatting occurs using 
     this.Language = XmlLanguage.GetLanguage(
         CultureInfo.CurrentCulture.IetfLanguageTag); 

Там больше информации в этом блоге:

http://www.west-wind.com/weblog/posts/796725.aspx

+0

Только то, что мне нужно для моего приложения Windows Phone 7 - с незначительным изменением: - this.Language = XmlLanguage.GetLanguage (CultureInfo.CurrentCulture.Name); –

+2

Вы можете сделать это в App.cs для всех привязок, как описано здесь: http://stackoverflow.com/questions/2764615/wpf-stringformat-0c-showing-as-dollars – Heiner

+1

'IetfLanguageTag' устарел. Вместо этого можно использовать '.Name'. – Mafii

1

стоит также отметить, что то же самое происходит в Silverlight, с т это же решение, за исключением замены IetfLanguageTag for Name.