如何在XAML元素中使用StringFormat?

59

我深入研究了一个绑定到订单的XAML元素堆栈。

订单日期显示为例如“12/31/2008 12:00:00 AM”。

我希望它显示为例如“31.12.2008”。

我该怎么做? 我看到其他stackoverflow问题提到了StringFormat,但它们以我无法使其工作的方式使用Multibinding。

这是我想要的语法(这是伪代码),仅在需要时指定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>
4个回答

87

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

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

3
你可以在字符串的任意一侧添加文本,例如:"开始日期:{0:dd-MM-yyyy}"。 - Ciaran Gallagher
我必须将StringFormat值中的单引号去掉。 - Grault
算了,最终我无法让我的StringFormat被执行,只能切换到ContentStringFormat。 - Grault

29
通常情况下,您可以寻找相关的*StringFormat依赖属性。例如,所有ContentControl实现(如Label和Tooltip)都具有ContentStringFormat依赖属性
<Label
    Content="{Binding Path=DateAsked}"
    ContentStringFormat="{}{0:yyyy/MM/dd HH:mm:ss}" />

在您的情况下,虽然 GridViewColumnHeaderStringFormat 依赖属性Header 相匹配,但是没有类似于 DisplayMemberBinding 的模拟方法,因此您需要使用新的 BindingBase.StringFormat 属性,需要 .NET 3.5 SP1(可以通过 Visual Studio 2008 SP1 获取)或更高版本:

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

博客文章尝试绑定.StringFormat中有更多示例。


1
我喜欢这个。甚至不知道ContentStringFormat。给了我一些想法。 - TravisWhidden

4

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}}”后,我最终采用了您的解决方案。 - Nasenbaer

1
如果您想本地化日期格式,可以将其包含在.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}}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接