2009-06-13 12 views
4

CurrentCultureが変更されたときに、XAMLドキュメントから無効な動作が発生しています。私はいくつかのウィンドウでは、このような要素を持っている場合:WPF 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" を));フォームが開始されたら、私は別の結果を見ています。

デフォルトの言語でフォームを実行すると、明らかにすべてが明らかです。しかし、コード内の文化や起動時にカルチャを変更すると、日付と数値のバインドはen-US形式で表示されます。表示されるMessageBox.Show()値は、現在のカルチャを適切に反映します。

質問:WPFはバインディングでCurrentCultureを尊重しませんか?そしてもしそうなら、バインディングに使われる文化を正確に決めるもの。それは私のケースでは明らかにen-USですが、プロジェクトでデフォルト言語として設定した内容に関係なく、常にen-USにバインドされています。

感謝任意のアイデア...

答えて

18

これは、WPFはXMLにバインディングにデフォルトでのCurrentCultureを尊重し、代わりにデフォルトしないことが判明:提供されていない場合ラングは、XAMLドキュメントにまたは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

+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

それは同じことをtと、Silverlightで起こることを指摘にも価値があります彼は名前のためにIetfLanguageTagを交換する以外は同じ解決策です。

関連する問題