Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, 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 Enum

Altro problema di Xamarin.Forms è che il controllo Picker si può popolare con una serie di elementi, ma il data-binding non è supportato se vogliamo che l'elenco di elementi provenga da un'enumerazione.

Girando su Internet alla ricerca di soluzioni, ne ho trovate diverse anche nei forum di Xamarin ma alla fine ho optato per quella mostrata in questo sito, Intellitect.

Viene spiegato come creare un picker che supporti enumerazioni, che sia "bindable", e che supporti anche enumerazioni per le quali vi sia una descrizione per ciascuna voce nell'enum. Per questo vi rimando al codice mostrato nel post per implementare il picker custom, ma ora vi racconto come si usa e i problemi da risolvere.

Questo picker usa la reflection per risalire, a runtime, alle data annotation con cui sono decorati gli enum. Bisogna quindi installare il pacchetto System.ComponentModel.Annotations da NuGet, problemino: non è supportato in UWP. Quindi:

  1. rimuovete il progetto UWP, Windows 8.1 e Windows Phone 8.1, ovviamente se lavorate solo per Android e iOS (altrimenti.. ci vogliono altre soluzioni)
  2. disinstallate il pacchetto Xamarin.Forms dal progetto PCL
  3. nelle proprietà del progetto, cambiate il target della PCL rimuovendo Windows Phone
  4. reinstallate Xamarin.Forms nel progetto PCL
Nota bene: le Data Annotations non hanno effetto sui controlli Xamarin.Forms, servono semplicemente per consentire al controllo custom di leggere gli attributi sugli enum. In questo modo:

public enum SampleEnumWithDescription
{
    [Display(Description = "First")]
    One,
    [Display(Description = "Second")]
    Two,
    [Display(Description = "Third")]
    Three
}

Poi nello XAML dovete dichiarare un namespace XML per mappare quello che contiene gli enum e uno per mappare quello che definisce la classe. Il controllo lo userete poi in questo modo:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"  
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"  
             xmlns:controls="clr-namespace:EnumBindablePickerSample.Controls;assembly=EnumBindablePickerSample"  
             xmlns:enums="clr-namespace:EnumBindablePickerSample.Enumerations;assembly=EnumBindablePickerSample"  
             x:Class="EnumBindablePickerSample.Views.PickerSamplePage"  
             Title="Sample Page">
  <StackLayout>
    <controls:EnumBindablePicker x:TypeArguments="enums:SampleEnum" 
                                 SelectedItem="{Binding SelectedEnum}">
      
    </controls:EnumBindablePicker>
    <Label Text="{Binding SelectedEnum}"></Label>
  </StackLayout>
</ContentPage>

Notate come bisogni specificare il namespace degli enum anche con x:TypeArguments. Il sito non vi dice che SelectedItem va in binding TwoWay, quindi occhio a non dimenticarlo.

Alessandro

Print | posted on giovedì 15 settembre 2016 00:00 | Filed Under [ Xamarin ]

Powered by:
Powered By Subtext Powered By ASP.NET