我想动态设置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>
答案 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>