如何在 XAML 元素中使用 StringFormat?

Posted

技术标签:

【中文标题】如何在 XAML 元素中使用 StringFormat?【英文标题】:How to use StringFormat in XAML elements? 【发布时间】:2009-03-26 13:19:06 【问题描述】:

我对绑定到订单的元素的 XAML 堆栈很感兴趣。

订单日期显示为例如“2008 年 12 月 31 日上午 12:00:00”。

我希望它显示为例如“2008 年 12 月 31 日”。

我该怎么做?我看到other *** questions 提到了 StringFormat,但他们以我无法开始工作的方式使用多重绑定。

这是我想要的那种语法(这是伪代码),只需在需要的地方指定 StringFormat,这可能吗?

<StackPanel>
    <ListView ItemsSource="Binding Orders">
        <ListView.View>
            <GridView>
                <GridViewColumn 
                    Header="Order ID" 
                    DisplayMemberBinding="Binding Path=OrderID"
                    StringFormat="1:dd.MM.yyyy"/>
                <GridViewColumn 
                    Header="Order Date" 
                    DisplayMemberBinding="Binding Path=OrderDate"/>
            </GridView>
        </ListView.View>
    </ListView>
</StackPanel>

【问题讨论】:

【参考方案1】:

我还没有测试过,但我认为这应该可以工作:

<GridViewColumn
    Header="Order Date"
    DisplayMemberBinding=
        "Binding Path=OrderDate, StringFormat='0:dd.MM.yyyy'"/>

【讨论】:

您可以在字符串的任一侧附加文本,例如"开始日期:0:dd-MM-yyyy" 我不得不从 StringFormat 值中去掉单引号。 从头开始,我最终无法让我的 StringFormat 得到尊重,不得不切换到 ContentStringFormat。【参考方案2】:

通常,您可以查找关联的*StringFormat 依赖属性。例如,所有ContentControl 实现(例如Label 和Tooltip)都有ContentStringFormat dependency property:

<Label
    Content="Binding Path=DateAsked"
    ContentStringFormat="0:yyyy/MM/dd HH:mm:ss" />

在您的情况下,虽然 GridViewColumn 具有与 Header 一起使用的 HeaderStringFormat dependency property,但 DisplayMemberBinding 没有类似物,因此您将需要 .NET 3.5 SP1(使用 Visual Studio 2008 SP1 获取它) 或更好地使用新的BindingBase.StringFormat Property:

<GridViewColumn 
    Header="Order ID"
    DisplayMemberBinding="Binding Path=OrderID, StringFormat='0:dd.MM.yyyy'"
/>

在博文Trying out Binding.StringFormat 中有更多示例。

【讨论】:

我喜欢这个。甚至不知道 ContentStringFormat。给我一些想法。【参考方案3】:

XAML

<UserControl.Resources>
    <myNamespace:DateTimeConverter x:Key="DateTimeConverter" />
</UserControl.Resources>

<GridViewColumn 
DisplayMemberBinding=="Binding Path=OrderDate, Converter=StaticResource DateTimeConverter" 
/>

C#

public class DateTimeConverter : IValueConverter

    public object Convert(object value,
                       Type targetType,
                       object parameter,
                       CultureInfo culture)
    
        if (value != null)
        
            return ((DateTime)value).ToString("dd.MM.yyyy");
        
        else
        
            return String.Empty;
        
    

    public object ConvertBack(object value,
                              Type targetType,
                              object parameter,
                              CultureInfo culture)
    
        return DateTime.Parse(value.ToString());
    

【讨论】:

经过数小时搜索我如何获得 ConverterCulture=x:Static sysglb:CultureInfo.CurrentUICulture"of 其他答案的运行后,我以您的解决方案结束。【参考方案4】:

如果您想本地化日期格式,您可以将其包含在您的 .resx 文件中。您必须按照以下指南设置您的应用程序进行本地化:https://developer.xamarin.com/guides/xamarin-forms/advanced/localization/。

resx 条目:

<data name="DateFormat" xml:space="preserve">
    <value>0:dddd d MMMM H&#x3a;mm</value>
</data>

然后在您的内容页面中包含 resx 文件的位置

xmlns:il8n="clr-namespace:MyProject.Localization;assembly=MyProject"

然后你可以像这样在你的绑定中使用它:

<Label
    Text = "Binding Time, StringFormat=il8n:Translate DateFormat"

【讨论】:

以上是关于如何在 XAML 元素中使用 StringFormat?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取存储在字符串变量中的XAML元素名称?

如何在 C# 中找到 XAML 元素的名称?

如何创建一个接受在 XAML 中添加子元素的 UserControl

如何在自定义嵌套用户控件中引用另一个 XAML 元素?

如何在 XAML 代码中创建支持其中其他元素的 UserControl

如何按存储在字符串变量中的名称获取 XAML 元素?