带有标签和 ContentStringFormat 作为绑定的 UserControl

UserControl with Label and ContentStringFormat as Binding

我有一个包含标签的用户控件。我将 Content-属性 绑定到一个双精度数,并将 ContentStringFormat-属性 绑定到一个字符串。我用它来显示百分比值,但格式必须是可配置的。

这是特定部分的 XAML:

<Label Name="lbl_percent"
       Content="{Binding ValuePercentage, ElementName=userControl}"
       ContentStringFormat="{Binding ElementName=userControl, Path=FontFormat}"
       Foreground="{Binding ElementName=userControl, Path=TextColor}"
       HorizontalAlignment="Center" VerticalAlignment="Center"
       RenderTransformOrigin="0.5,0.5" />

它按预期工作,但有一个特定问题。逗号不是我所期望的。

如果我有一个 'de-de' 的系统,我希望它是:

    expected     shown
    25,3         25.3

我该如何解决这个问题?我已经尝试用 CurrentCulture 添加一个 covnerterCulture,但这显示了一个错误(它仍然使用点而不是逗号):

Das Element "CurrentCulture" wurde nicht erkannt, oder es kann nicht auf das Element zugegriffen werden.

这也翻译:

The Element "CurrentCulture" was not recognized, or the item could not be accessed.

我该如何解决这个问题? StringFormat 必须是可绑定的。

FrameworkElement class 有一种语言 属性,您可以将其绑定到 XmlLanguage 源 属性:

<Label Name="lbl_percent"
   Content="{Binding ValuePercentage, ElementName=userControl}"
   ContentStringFormat="{Binding ElementName=userControl, Path=FontFormat}"
   Foreground="{Binding ElementName=userControl, Path=TextColor}"
   HorizontalAlignment="Center" VerticalAlignment="Center"
   RenderTransformOrigin="0.5,0.5"
   Language="{Binding TheLang, ElementName=userControl}" />

private readonly System.Windows.Markup.XmlLanguage _lang = System.Windows.Markup.XmlLanguage.GetLanguage("de-DE");
public System.Windows.Markup.XmlLanguage TheLang => _lang;

但是,如果您希望它是动态的,您不妨将另一个 属性 添加到您的源对象中,该 returns 一个已经根据您的 "FontFormat" 格式化的字符串和一个特定文化,例如:

    public string FormattedValuePercentage
    {
        get
        {
            return ValuePercentage.ToString(FontFormat, new System.Globalization.CultureInfo("de-DE"));
        }
    }

...并将 Label 的内容 属性 直接绑定到这个:

<Label Name="lbl_percent"
   Content="{Binding FormattedValuePercentage, ElementName=userControl}" />

您可以将 Label 的 Language 属性 绑定到视图模型中 XmlLanguage 类型的 属性:

public class ViewModel
{
    public XmlLanguage Language { get; set; } = XmlLanguage.GetLanguage("de");
    ...
}

XAML:

<Label ... Language="{Binding Language}" />