45

私の場合:

DateTime型のプロパティへのTextBlockバインディングがあります。ユーザーの地域設定にあるように表示したい。

<TextBlock Text="{Binding Date, StringFormat={}{0:d}}" />

言語プロパティをWPFXAMLバインディングとして設定しており、CurrentCultureDisplayは次のように 述べています。

this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);

しかし、このコード行では、システム領域設定で選択された有効な値が示すようにではなく、CurrentCultureのIetfLanguageTagが示すCultureInfoのデフォルト形式としてテキストを表示するだけです。

(たとえば、「de-DE」の場合、選択されたyyyy-MM-ddの代わりにdd.MM.yyyyが使用されます)

リージョン設定:デフォルトではありませんが、yyy-MM-ddが使用されます

すべてのバインディングでConverterCultureを定義せずに、バインディングが正しい形式を使用する方法はありますか?

コード内

string.Format("{0:d}",Date);

適切なカルチャ設定を使用します。

編集:

希望どおりに機能しない別の方法(this.Language = ...のように):

xmlns:glob="clr-namespace:System.Globalization;assembly=mscorlib"

<Binding Source="{x:Static glob:CultureInfo.CurrentCulture}" 
 Path="IetfLanguageTag" 
 ConverterCulture="{x:Static glob:CultureInfo.InvariantCulture}" />
4

9 に答える 9

30

作成時に ConverterCulture を現在のカルチャに自動的に設定するバインディングのサブクラス (CultureAwareBinding など) を作成できます。

これは完全な解決策ではありませんが、おそらくこれが唯一の解決策です。なぜなら、カルチャを尊重するよう Binding をさかのぼって強制すると、この動作に依存する WPF の他のコードが壊れる可能性があるからです。

さらにサポートが必要な場合はお知らせください。

于 2011-05-09T13:23:05.637 に答える
22

これは、aKzenT からの回答の拡張です。彼らは、Binding クラスのサブクラスを作成し、ConverterCulture を CurrentCulture に設定することを提案しました。答えは非常に単純ですが、それを実装することにあまり慣れていない人もいると思うので、aKzenT の答えのコード バージョンを XAML での使用方法の例と共有しています。

using System;
using System.Globalization;
using System.Windows.Data;

namespace MyWpfLibrary
{
    public class CultureAwareBinding : Binding
    {
        public CultureAwareBinding()
        {
            ConverterCulture = CultureInfo.CurrentCulture;
        }
    }
}

XAML でこれを使用する方法の例

1) 名前空間を XAML ファイルにインポートする必要があります。

<Page
    ...
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:myWpfLib="clr-namespace:MyWpfLibrary;assembly=<assembly_name>"
    ...
>

2) CultureAwareBinding の実際の使用法

<Textblock Text="{myWpfLib:CultureAwareBinding Path=Salary, Source=Contact, StringFormat={}{0:C}}" />
于 2013-11-05T18:38:29.573 に答える
4

あなたの 2 回目の試みは近かったので、私にとって有効な解決策にたどり着きました。

ConverterCulture の設定に関する問題は、コンバーターがある場合にのみ使用されることです。したがって、フォーマットをパラメーターとして受け取る単純な StringFormatConverter を作成するだけです。

public sealed class StringFormatConverter : IValueConverter
{
    private static readonly StringFormatConverter instance = new StringFormatConverter();
    public static StringFormatConverter Instance
    {
        get
        {
            return instance;
        }
    }

    private StringFormatConverter()
    {
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Format(culture, (string)parameter, value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

次に、バインディングを調整できます (コンバーターの名前空間を「my」としてインポートしたと仮定します)。

<TextBlock Text="{Binding Date, Converter={x:Static my:StringFormatConverter.Instance}, ConverterCulture={x:Static glob:CultureInfo.CurrentCulture}, ConverterParameter={}{0:d}}" />
于 2011-08-25T21:08:43.020 に答える
2

すべてのバインディングの更新を回避するハック/回避策を思いつきました。このコードをメイン ウィンドウのコンストラクターに追加します。

XmlLanguage language = XmlLanguage.GetLanguage("My-Language");
typeof(XmlLanguage).GetField("_compatibleCulture", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(language, CultureInfo.CurrentCulture);
this.Language = language;

リフレクションを使用しているため、将来的に機能するという保証はありませんが、現時点では機能します (.NET 4.6)。

于 2015-11-26T15:23:32.927 に答える
-1

コード ビハインドの言語を変更してみてはどうでしょうか。

this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);
于 2012-07-19T09:28:02.823 に答える
-1

「this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);」の使用を回避している問題 は実際には一般的なものではありません。ここフランスでは、日付形式を米国または日本の形式に変更するユーザーを知りません。少なくとも、そのような変更が可能であることを知っているユーザーがいないからです(そして、その方法を知らないためです)...もちろん、「language=」は完璧ではありませんが、何年にもわたる WPF と Silverlight の実践において、どのユーザーにもこの種の問題は見られませんでした。本当のニーズの 100%。もちろん、他のソリューションの方が優れているように見えますが、その必要はありません (そして、「language=" ソリューションと比較して完璧とはほど遠い実装がいくつか見られました)。

于 2014-08-23T19:08:31.047 に答える