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

时间:2011-08-22 19:30:28

标签: 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)));
}

窗口

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

MyCustomControl

<StackPanel>
    <TextBlock Text="{Binding Number, ElementName=BoxPanelElement, 
        StringFormat={}{0:C}}" /> //display this with specific culture
    <TextBlock Text="{Binding Text, ElementName=BoxPanelElement}" />
</StackPanel>

2 个答案:

答案 0 :(得分:5)

如果我正确理解了您的问题,您希望将文化绑定到特定的TextBlock

您无法绑定Binding的属性,因此绑定ConverterCulture将不起作用。

Language上有一个FrameworkElement属性可以正常设置

<TextBlock Language="en-US"
           Text="{Binding Number,
                          ElementName=BoxPanelElement,
                          StringFormat={}{0:C}}"/>

然而,当试图绑定这个属性时,我得到一个奇怪的例外 我可能会自己就这个例外问一个问题

  

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

根据Thomas Levesque的答案,这应该是可能的,但也许我做错了。WPF xml:lang/Language binding

我开始工作的所有工作都是使用附加行为,当MyCulture更新时,该行为会更新Language

<TextBlock local:LanguageBehavior.Language="{Binding MyCulture}"
           Text="{Binding MyNumber,
                          ElementName=BoxPanelElement,
                          StringFormat={}{0:C}}"/>

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());
    }
}

答案 1 :(得分:1)

似乎转换器就是答案。界面包含文化价值。

    Convert(object value, Type targetType, object parameter, CultureInfo culture) 

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

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

传递参数的语法是:

    Converter={StaticResource colorConverter}, ConverterParameter=GREEN}" 

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

我同意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>