WPF のカルチャー

WPF で以下の XAML を書いて実行すると、日付と時刻が「10/29/2009 7:56:33 PM」と en-US カルチャーで表示されてしまいます。

<Window x:Class="LangTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="LangTest"
    SizeToContent="WidthAndHeight">
    <TextBlock Margin="30"
        Text="{Binding Source={x:Static sys:DateTime.Now}}"/>
</Window>

これを「2009/10/29 19:56:33」のように ja-JP カルチャーで表示するには、App クラスの OnStartup をオーバーライドしてカルチャーを指定すれば OK です。

protected override void OnStartup( StartupEventArgs e )
{
    FrameworkElement.LanguageProperty.OverrideMetadata(
      typeof( FrameworkElement ),
        new FrameworkPropertyMetadata(
          XmlLanguage.GetLanguage( CultureInfo.CurrentCulture.IetfLanguageTag ) ) );

    base.OnStartup( e );
}

ほかにも XAMLxml:lang="ja-JP" を付ける、Language="ja-JP" を付けるなどの方法もあります。

そして、これはバグではなくデザインだそうです。以下の connect にあります。
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=442569
回答はとても興味深いもので、従来の .NET の国際化まわりのチェックをしなかったのはよくなかったと考えており、きちんと明示させる方向を選んだそうです。FxCop はこのあたりをうるさく指摘しますよね。WPF のこの仕組みにより、デザイナー(美術さんじゃなくアプリデザイナーのことだと思います)がきちんとカルチャーについて考えるようにしむけたいようです。

まあ、でも、ネットを見るとこの問題は FAQ で、上のコードを書けという答えばかりで、カルチャーを意識させるのは失敗しているようです…(^^;
id:siokoshou:20090310 に書いた Binding チートシートの最後にもこのコードだけが載ってます。