Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

String format using UWP and x:Bind

Tags:

c#

xaml

uwp

Does anyone know how to format a date when using x:Bind in a UWP Windows 10 app?

I have a TextBlock that is bound (x:Bind) to a DateTime property on my ViewModel which is read from SQL. I want to format the output to "dd/MM/yyy HH:mm (ddd)". Is there a simple way of doing this?

The default format is "dd/MM/yyy HH:mm:ss" which I presume is coming from a default. Could this be replaced maybe?

Thanks.

like image 805
Ian GM Avatar asked Dec 01 '15 17:12

Ian GM


People also ask

Can you use X bind in WPF?

x:Bind for WPF in . NET Framework and . NET Core is still not supported.

What is data binding in UWP?

Data binding is the process that establishes a connection between the UI layer with our Data Layer. So when you change your Data your GUI is updated and vice versa.


4 Answers

Use a StringFormatConverter (check if you maybe use some library, which already includes it, e.g. the UWP Toolkit (thanks, @maxp) or the older Cimbalino Toolkit):

public class StringFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null)
            return null;

        if (parameter == null)
            return value;

        return string.Format((string)parameter, value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

add it to your page resource

<Page.Resources>
    <converters:StringFormatConverter x:Key="StringFormatConverter" />
</Page.Resources>

and use it like this

<TextBlock Text="{x:Bind Text, Converter={StaticResource StringFormatConverter}, ConverterParameter='{}{0:dd/MM/yyy HH\\\\:mm (ddd)}'}" />
like image 88
sibbl Avatar answered Sep 30 '22 00:09

sibbl


you can use

{x:Bind ViewModel.DateTimeProperty.ToString("....")}
like image 24
Ivan Avatar answered Sep 30 '22 02:09

Ivan


Formated DateTime

Function binding is much better approach than classic Converter:

 <TextBlock Text="{x:Bind DateTimeToString(MyDateTime,'dd/MM/yyy HH\\\\:mm (ddd)')}" />

Code behind (it could be placed in separate class):

//"Converter"
public string DateTimeToString(DateTime dateTime, string format) => dateTime.ToString(format);

public DateTime MyDateTime { get; set; } = DateTime.Now;

Why is it better than classic converter?

  • Shorter -> no boil plait code
  • Strongly typed -> Detects exceptions in build time.
like image 36
Alamakanambra Avatar answered Sep 30 '22 02:09

Alamakanambra


similar to the code behind

xmlns:globalization="using:System.Globalization"
...

{x:Bind ViewModel.DateTimeProperty.ToString('dd/MM/yyy HH:mm (ddd)', globalization:DateTimeFormatInfo.InvariantInfo)}

...

like image 34
dex Avatar answered Sep 30 '22 02:09

dex