2009-03-26 14 views
49

Ich bin tief in einem XAML-Stapel von Elementen, die an Bestellungen gebunden sind.Wie verwendet man StringFormat in XAML-Elementen?

Das Bestelldatum wird z. "31.12.2008 12:00:00 Uhr".

Ich möchte es als z. "31.12.2008".

Wie kann ich das tun? Ich habe gesehen, other stackoverflow questions erwähnen StringFormat, aber sie verwenden Multibinding in einer Weise, die ich nicht zur Arbeit kommen kann.

Hier ist die Art von Syntax, die ich möchte (das ist Pseudocode), einfach StringFormat angeben, wo Sie es brauchen, ist das irgendwie möglich?

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

Antwort

72

ich es nicht getestet, aber ich denke, das sollte funktionieren:

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

ja Bingo danke! –

+3

Und Sie können Text auf jeder Seite anhängen der Zeichenfolge, zB "Startdatum: {0: TT-MM-JJJJ}" –

+0

Ich musste die einfachen Anführungszeichen vom StringFormat-Wert entfernen – Grault

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()); 
    } 
} 
+2

Es ist viel weniger Arbeit, die StringFormat-Methode zu verwenden. –

+0

Seit Stunden der Suche, wie ich die 'ConverterCulture = {x: Static sysglb: CultureInfo.CurrentUICulture}}" "anderer Antworten ausgeführt bekomme, endete ich mit Ihrer Lösung. – Nasenbaer

28

In der Regel können Sie schauen für eine zugehörige *StringFormat Abhängigkeit prop bitter. Zum Beispiel werden alle ContentControl Implementierungen (wie Etiketten und Tooltip) haben die ContentStringFormat dependency property:

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

In Ihrem Fall, während die GridViewColumn die HeaderStringFormat dependency property zu gehen zusammen mit Header hat, gibt es keine Entsprechung für die DisplayMemberBinding ist und so Sie .NET 3.5 SP1 (bekommt es mit Visual Studio 2008 SP1) müssen oder besser nutzen die neuen BindingBase.StringFormat Property:

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

es gibt viele weitere Beispiele in der Blog-Post Trying out Binding.StringFormat.

+1

Ich mag diesen.Wusste nicht einmal über das ContentStringFormat. Gibt mir ein paar Ideen. – TravisWhidden

+0

Dito als TravisWhidden – Paul

0

Wenn Sie das Datumsformat lokalisieren möchten, können Sie es in Ihre RESX-Datei aufnehmen. Sie müssen Ihre App für die Lokalisierung einrichten, indem Sie diesem Handbuch folgen: https://developer.xamarin.com/guides/xamarin-forms/advanced/localization/.

Der resx Eintrag:

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

In Ihrer Content-Seite, sind Sie dann den Speicherort der resx Datei

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

Und dann können Sie es in Ihrer Bindung wie so:

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