【问题标题】:UserControl with Label and ContentStringFormat as Binding以 Label 和 ContentStringFormat 作为绑定的 UserControl
【发布时间】:2016-12-16 11:06:43
【问题描述】:

我有一个包含标签的用户控件。我将 Content-Property 绑定到 double 并将 ContentStringFormat-Property 绑定到 String。我用它来显示百分比值,但格式必须是可配置的。

这是特定部分的 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。

这也是翻译:

无法识别元素“CurrentCulture”,或无法访问该项目。

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

【问题讨论】:

  • 您可以在标签上设置Language="de-DE" 或只设置Language="de"
  • de-de 只是一个例子,它可以也将用于其他不能 de-de 的环境

标签: wpf user-controls


【解决方案1】:

FrameworkElement 类有一个可以绑定到 XmlLanguage 源属性的 Language 属性:

<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;

但是,如果您希望它是动态的,您不妨向源对象添加另一个属性,该属性返回一个已根据您的“FontFormat”和特定文化格式化的字符串,例如:

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

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

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

【讨论】:

  • 实际上,Language 属性是可绑定的,尽管不是字符串。它的类型是XmlLanguage
  • 这有帮助,谢谢。我只需要添加一个 setter fpr this 并在 double 值更改时更新它以获得正确的值。
【解决方案2】:

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

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

XAML:

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

【讨论】:

  • 我稍后会尝试,目前,@mm8 的解决方案帮助了我。
猜你喜欢
  • 2023-03-16
  • 2015-08-02
  • 2020-07-28
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
相关资源
最近更新 更多