web-dev-qa-db-fra.com

Comment utiliser StringFormat dans des éléments XAML?

Je suis au cœur d'une pile d'éléments XAML liant les commandes.

La date de la commande s’affiche, par exemple, "31/12/2008 00:00:00".

Je veux qu'il s'affiche comme par exemple "31.12.2008".

Comment puis-je faire ceci? J'ai vu d'autres questions de stackoverflow mentionne StringFormat, mais ils utilisent la liaison multiple d'une manière que je ne peux pas me rendre au travail.

Voici le type de syntaxe que je voudrais (il s’agit d’un pseudocode), en spécifiant simplement StringFormat où vous en avez besoin, est-ce possible?

<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>
52
Edward Tanguay

Je ne l'ai pas testé, mais je pense que cela devrait fonctionner:

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

En général, vous pouvez rechercher une propriété de dépendance *StringFormat associée. Par exemple, toutes les implémentations ContentControl (telles que Label et Tooltip) ont la propriété de dépendance ContentStringFormat :

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

Dans votre cas, alors que GridViewColumn a la propriété de dépendance HeaderStringFormat pour aller avec Header, il n’existe pas d’analogue pour DisplayMemberBinding et vous aurez donc besoin de .NET 3.5 SP1 (obtenez-le avec Visual Studio 2008 SP1 ) ou mieux, utilisez la nouvelle propriété BindingBase.StringFormat :

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

Il y a beaucoup d'autres exemples sur le blog Trying out Binding.StringFormat .

28
Olivier Dagenais

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());
    }
}
3
sipwiz

Si vous souhaitez localiser le format de date, vous pouvez l'inclure dans votre fichier .resx. Vous devrez configurer votre application pour la localisation en suivant ce guide: https://developer.xamarin.com/guides/xamarin-forms/advanced/localization/ .

L'entrée resx:

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

Dans votre page de contenu, vous incluez ensuite l'emplacement du fichier resx

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

Et puis vous pouvez l’utiliser dans votre reliure comme ceci:

<Label
    Text = "{Binding Time, StringFormat={il8n:Translate DateFormat}}"
0
RobVoisey