Alessandro Del Sole's Blog

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

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, MVVM e il refresh dei command

Per questo post prendo spunto da una domanda ricevuta durante un corso che ho appena tenuto su Xamarin Forms, fornendo una soluzione che abbiamo recuperato tramite Internet ma che merita qualche approfondimento.

Se anche voi provenite da WPF e siete abituati ad utilizzare il pattern Model-View-ViewModel, sapete che la classe RelayCommand implementa l'interfaccia ICommand, che obbliga la classe ad avere, tra gli altri, un metodo CanExecute. Questo serve a dire agli oggetti in binding se un comando può essere eseguito oppure no.

Se ad esempio un pulsante è in binding con un comando e CanExecute è False, il pulsante risulta disabilitato. In WPF esiste la classe CommandManager e il suo metodo RequerySuggested, che consentono a RelayCommand di aggiornare manualmente lo stato di CanExecute. Essi però fanno parte dell'assembly PresentationCore che, ovviamente, in Xamarin non è disponibile.

In Xamarin Forms, però, esiste una classe Command che, oltre ad implementare ICommand, ha una struttura leggermente diversa e che può fare al caso. Per ottenere il risultato, in buona sostanza, si può riscrivere RelayCommand ereditando da Command invece che implementare ICommand e mettersi in ascolto di eventi PropertyChanged, al verificarsi dei quali verrà chiamato manualmente un delegate che si chiama ChangeCanExecute e che si occuperà di aggiornare, per l'appunto, lo stato di CanExecute.

Tradotto in codice:

    public class RelayCommand : Command
    {
        
public RelayCommand(Action<object> execute)
            : 
base(execute)
        {
        }

        
public RelayCommand(Action execute)
            : 
this(o => execute())
        {
        }

        
public RelayCommand(Action<object> execute, Func<objectbool> canExecute, INotifyPropertyChanged npc = null)
            : 
base(execute, canExecute)
        {
            
if (npc != null)
                npc.PropertyChanged += 
delegate { ChangeCanExecute(); };
        }

        
public RelayCommand(Action execute, Func<bool> canExecute, INotifyPropertyChanged npc = null)
            : 
this(o => execute(), o => canExecute(), npc)
        {
        }
    }

Fonte qui.

Alessandro

Print | posted on giovedì 30 giugno 2016 19:29 | Filed Under [ Xamarin ]

Powered by:
Powered By Subtext Powered By ASP.NET