WPF XAML绑定和CurrentCulture显示

5

当当前区域设置改变时,我发现XAML文档会出现一些无效的行为。当我在窗口中有以下元素时:

<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"));,结果却不同。如果我使用默认语言运行表单,显然一切都很好。但是,如果我在代码或启动时更改文化,则日期和数字值的绑定仍显示en-US格式。MessageBox.Show()正确地显示了当前文化的值。
问题:WPF是否不尊重绑定中的CurrentCulture?如果是这样,那么到底是什么决定了用于绑定的文化。在我的情况下,显然是en-US,但无论我在项目中设置哪种默认语言,它始终以en-US绑定。
感谢任何想法...
2个回答

19

事实证明,WPF在绑定中默认不遵循CurrentCulture,而是默认为在XAML文档中定义的xml:Lang设置或en-US(如果未提供)。这是相当糟糕的行为-不确定为什么您不会像其他UI技术一样应用自动区域设置格式,但是...

幸运的是,可以在文档构造函数或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


正是我需要的Windows Phone 7应用程序 - 只需进行小修改:this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.Name); - Greg Woods
2
您可以在 App.cs 中为所有绑定执行此操作,如此处所述:https://dev59.com/nnE85IYBdhLWcg3wdDSz。 - Heiner
2
IetfLanguageTag已被弃用,可以使用.Name代替。 - Mafii

1
值得一提的是,在Silverlight中也会发生同样的事情,解决方案相同,只需将IetfLanguageTag替换为Name即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接