WPF XAML 绑定和 CurrentCulture 显示

Posted

技术标签:

【中文标题】WPF XAML 绑定和 CurrentCulture 显示【英文标题】:WPF XAML Bindings and CurrentCulture Display 【发布时间】:2021-11-30 21:28:13 【问题描述】:

当 CurrentCulture 更改时,我在 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 中。

任何想法表示赞赏...

【问题讨论】:

【参考方案1】:

事实证明,默认情况下,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); 您可以在 App.cs 中为所有绑定执行此操作,如下所述:***.com/questions/2764615/… IetfLanguageTag 已弃用。可以改用.Name【参考方案2】:

还值得指出的是,同样的事情发生在 Silverlight 中,除了将 IetfLanguageTag 替换为 Name 之外,使用相同的解决方案。

【讨论】:

以上是关于WPF XAML 绑定和 CurrentCulture 显示的主要内容,如果未能解决你的问题,请参考以下文章

XAML WPF 的绑定/引用方法

WPF 绑定

如何在 WPF/XAML 中绑定背景颜色?

为啥 WPF/XAML 绑定使用 x:Reference 气质?

wpf : 绑定到另一个 xaml 文件中的控件

具有在 XAML 中定义的选项的数据绑定 WPF ComboBox?