如何在WPF UserControl中显示动态文化格式化的数字

Dav*_*vid 3 c# wpf cultureinfo

我想动态设置Number文本块的文化格式,其中包含传递给MyUserControl的文化和数字值.MyCulture和Number值将传递给MyCustomControl,其格式为"en-GB","en-US"等.

我在asp.NET MVC中使用扩展方法做了类似的事情,但需要帮助如何在WPF中将它拼凑在一起.

示例MVC扩展方法

public static MvcHtmlString CulturedAmount(this decimal value, 
    string format, string locale)
{
    if (string.IsNullOrEmpty(locale))
        locale = HttpContext.Current.Request.UserLanguages[0];

    return MvcHtmlString.Create(value.ToString(format, 
        CultureInfo.CreateSpecificCulture(locale)));
}
Run Code Online (Sandbox Code Playgroud)

窗口

//MyMoney is a decimal, MyCulture is a string (e.g. "en-US")
<MyCustomControl Number="{Binding MyMoney}" Culture="{Binding MyCulture}" 
    Text="Some Text" />
Run Code Online (Sandbox Code Playgroud)

MyCustomControl

<StackPanel>
    <TextBlock Text="{Binding Number, ElementName=BoxPanelElement, 
        StringFormat={}{0:C}}" /> //display this with specific culture
    <TextBlock Text="{Binding Text, ElementName=BoxPanelElement}" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

Fre*_*lad 5

如果我正确理解你的问题,你想要将文化与特定的文化结合起来TextBlock.

你不能绑定一个Binding如此绑定的属性ConverterCulture将无法正常工作.

有一个Language属性FrameworkElement可以正常工作这样设置

<TextBlock Language="en-US"
           Text="{Binding Number,
                          ElementName=BoxPanelElement,
                          StringFormat={}{0:C}}"/>
Run Code Online (Sandbox Code Playgroud)

但是,在尝试绑定此属性时,我得到一个奇怪的例外,
我可能会自己问一个关于此异常的问题

属性"语言"的绑定不能使用目标元素的语言进行转换; 如果需要文化,则必须在Binding上明确指定ConverterCulture.

根据Thomas Levesque的回答,这应该是可能的,所以也许我做错了什么.. WPF xml:lang /语言绑定

我开始工作的只是使用附加行为,而LanguageMyCulture更新后又会更新.

<TextBlock local:LanguageBehavior.Language="{Binding MyCulture}"
           Text="{Binding MyNumber,
                          ElementName=BoxPanelElement,
                          StringFormat={}{0:C}}"/>
Run Code Online (Sandbox Code Playgroud)

LanguageBehavior

public class LanguageBehavior
{
    public static DependencyProperty LanguageProperty =
        DependencyProperty.RegisterAttached("Language",
                                            typeof(string),
                                            typeof(LanguageBehavior),
                                            new UIPropertyMetadata(LanguageBehavior.OnLanguageChanged));

    public static void SetLanguage(FrameworkElement target, string value)
    {
        target.SetValue(LanguageBehavior.LanguageProperty, value);
    }
    public static string GetLanguage(FrameworkElement target)
    {
        return (string)target.GetValue(LanguageBehavior.LanguageProperty);
    }
    private static void OnLanguageChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        FrameworkElement element = target as FrameworkElement;
        element.Language = XmlLanguage.GetLanguage(e.NewValue.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)


pap*_*zzo 1

看来转换器就是答案。该界面包含文化价值观。

    Convert(object value, Type targetType, object parameter, CultureInfo culture) 
Run Code Online (Sandbox Code Playgroud)

但我找不到传递文化的语法。抱歉,这不是完整且经过测试的答案,但我没时间了。

绑定文化的 URL。
http://msdn.microsoft.com/en-us/library/system.windows.data.binding.converterculture.aspx

传递参数的语法是:

    Converter={StaticResource colorConverter}, ConverterParameter=GREEN}" 
Run Code Online (Sandbox Code Playgroud)

您可能需要使用 ConverterParameter 将区域性作为字符串传递。

我同意 Meleak 的观点,不能将参数绑定到转换器。给了他+1。但我认为你可以用 MultiBinding 转换器来愚弄它。

    <TextBlock Name="textBox2" DataContext="{StaticResource NameListData}">
        <TextBlock.Text>
            <MultiBinding Converter="{StaticResource myCutlureConverter}"
              ConverterParameter="FormatLastFirst">
                  <Binding Path="InputValue"/>
                  <Binding Path="CultureTxt"/>
            </MultiBinding>
         </TextBlock.Text>
    </TextBlock>
Run Code Online (Sandbox Code Playgroud)