Как использовать StringFormat в элементах XAML? - PullRequest
52 голосов
/ 26 марта 2009

Я глубоко в стеке элементов XAML, привязываемых к заказам.

Дата заказа отображается как, например, «31.12.2008, 12:00:00».

Я хочу, чтобы он отображался как, например. "31.12.2008".

Как я могу это сделать? Я видел другие вопросы о стековом потоке , в которых упоминается 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>

Ответы [ 4 ]

77 голосов
/ 26 марта 2009

Я не проверял это, но я думаю, что это должно работать:

<GridViewColumn
    Header="Order Date"
    DisplayMemberBinding=
        "{Binding Path=OrderDate, StringFormat='{}{0:dd.MM.yyyy}'}"/>
28 голосов
/ 25 сентября 2010

В общем, вы можете искать связанное свойство *StringFormat зависимости. Например, все реализации ContentControl (такие как Label и Tooltip) имеют свойство зависимости ContentStringFormat :

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

В вашем случае, в то время как GridViewColumn имеет свойство HeaderStringFormat для соответствия с Header, аналога для DisplayMemberBinding не существует, так что вам понадобится. NET 3.5 SP1 (получите Visual Studio 2008 SP1 ) или лучше, чтобы использовать новое свойство BindingBase.StringFormat :

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

В блоге есть еще много примеров Попытка Binding.StringFormat .

3 голосов
/ 26 марта 2009

1001 * 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());
    }
}
0 голосов
/ 25 июля 2017

Если вы хотите локализовать формат даты, вы можете включить его в свой файл .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}}"
...