Привязки WPF XAML и отображение CurrentCulture - PullRequest
4 голосов
/ 14 июня 2009

Я вижу недопустимое поведение в документах XAML при изменении CurrentCulture. Когда у меня есть несколько таких элементов в окне:

<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 ("c")); когда форма начинается, я вижу разные результаты.

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

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

Любые идеи приветствуются ...

Ответы [ 2 ]

19 голосов
/ 14 июня 2009

Оказывается, что WPF не учитывает CurrentCulture по умолчанию в привязках, и вместо этого по умолчанию используется значение xml: Lang, определенное в документе XAML, или en-US, если не указано. Это довольно неуклюжее поведение - не уверен, почему бы вам НЕ применять автоматическое форматирование культуры как любую другую технологию пользовательского интерфейса, но ...

К счастью, есть простой обходной путь, который можно применить в конструкторе документа или базовом классе 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 / блог / сообщений / 796725.aspx

1 голос
/ 02 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...