Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Xamarin.Forms: binding di Nullable

Il controllo DatePicker di Xamarin.Forms funziona bene ma non supporta il data-binding a oggetti di tipo Nullable<DateTime>.

Ovviamente la problematica è cara a molte persone In questo thread nei forum di Xamarin ci sono diverse soluzioni, a fattor comune tutte aggiungono una bindable property chiamata NullableDate a un controllo che eredita da DatePicker e alla quale poi si fa binding e che conterrà l'effettivo valore della proprietà Date esistente. Tra le varie soluzioni proposte nel thread, io mi sono trovato bene con quella che vi riporto:

public class CustomDatePicker : DatePicker
{
    private string _format = null;
    public static readonly BindableProperty NullableDateProperty = BindableProperty.Create<CustomDatePickerDateTime?>(p => p.NullableDate, null);
    public DateTime? NullableDate
    {
        get { return (DateTime?)GetValue(NullableDateProperty); }
        set { SetValue(NullableDateProperty, value); UpdateDate(); }
    }
 
    public static readonly BindableProperty DateFormatProperty = BindableProperty.Create<CustomDatePickerstring>(p => p.DateFormat,
            defaultValue: default(string),
            defaultBindingMode: BindingMode.OneWay,
            propertyChanging: (bindable, oldValue, newValue) =>
            {
                var ctrl = (CustomDatePicker)bindable;
                ctrl.DateFormat = newValue;
            });
 
    public string DateFormat
    {
        get { return (string)GetValue(DateFormatProperty); }
        set { SetValue(DateFormatProperty, value); }
    }
 
    private void UpdateDate()
    {
        if (NullableDate.HasValue)
        {
            Format = DateFormat;
            Date = NullableDate.Value;
        }
        else
        {
            _format = Format;
            Format = "...";
        }
    }
    protected override void OnBindingContextChanged()
    {
        base.OnBindingContextChanged();
        UpdateDate();
    }
 
    protected override void OnPropertyChanged(string propertyName = null)
    {
        base.OnPropertyChanged(propertyName);
        if (propertyName == "Date")
            NullableDate = Date;
    }
}

Non dovrete far altro che aggiungere il solito namespace XML per referenziarlo e utilizzarlo nello XAML, lo utilizzerete esattamente come il DatePicker ma il binding lo farete a NullableDate invece che a Date e la formattazione sarà fatta con DateFormat invece che Format.

Alessandro

Print | posted on mercoledì 14 settembre 2016 00:00 | Filed Under [ Xamarin ]

Powered by:
Powered By Subtext Powered By ASP.NET