Login Register
venerdì 10 febbraio 2012
 
Forums
I Forum di WPF Tips & Tricks
WPF ICommand CanExecute... Quando???
Last Post 21 giu 2010 01:16 by Alessandro Del Sole [MVP]. 3 Replies.
Printer Friendly
Sort:
PrevPrev NextNext
You are not authorized to post a reply.
Author Messages Not Resolved
Roberto Sarati
Veteran Member
Veteran Member
Posts:267
Avatar

--
19 giu 2010 12:16  
Salve a tutti. Avrei una "semplice" domanda: Quando/Quanto spesso/In quale occasione viene chiamato il metodo CanExecute di un ICommand per verificare che un comando è abilitato?

Ho provato a non lanciare alcun PropertyChanged dal ViewModel, ma WPF magicamente abilita e disabilita il bottone. Avete info, non riesco a trovare nulla...

Bye.
Alessandro Del Sole [MVP]
Team
Team
Posts:121
Avatar

--
19 giu 2010 12:59  
Ciao, succede questo: CanExecute espone la condizione che rende un command eseguibile quando True. Cioè, se la condizione verificata in CanExecute è vera, il comando è eseguibile mentre, se False, non lo è. Quando un command è in binding con un controllo, ad esempio un Button, il runtime di WPF verifica costantemente la condizione proposta in CanExecute e di conseguenza abilita e disabilita il pulsante collegato. Il lavoro è fatto da un oggetto che si chiama CommandManager (http://msdn.microsoft.com/en-us/lib...ger.aspx), ma molte altre informazioni le trovi nella pagina MSDN Commanding Overview: http://msdn.microsoft.com/en-us/lib...52308.aspx

Le notifiche di INotifyPropertyChanged, invece, non hanno nulla a che vedere con questo comportamento.
Roberto Sarati
Veteran Member
Veteran Member
Posts:267
Avatar

--
19 giu 2010 01:49  
Grazie però ora...

Ora mi spiego molte cose. In pratica è il CommandManager che "sotto certe condizioni" (such as change in keyboard focus, item selection...) fa polling sul mio metodo CanExecute per verificare se il miol ICommand può o meno essere eseguito [e quindi disabilitare la mia interfaccia di conseguenza].
Insomma... CanExecute verrà chiamato un casino di volte (ecco che ora mi spiego anche perchè si mette l'attributo DebuggerStepThrough sul metodo)!

Però sulla pagina da te linkata (CommandManager) dice anche che, se volessi dire al CommandManager di effettuare il controllo basta eseguire il metodo CommandManager.InvalidateRequerySuggested(). Bene. Io ho scritto questo nel costruttore della mia classe:
new Task(new Action(() =>
{
System.Threading.Thread.Sleep(5000);
this.Username = "USERNAME";
this.Password = "PASSWORD";
System.Threading.Thread.Sleep(1000);
CommandManager.InvalidateRequerySuggested();
})).Start();
Però il mio bottone non si riabilita almeno fino a quando non clicco sul form. Cosa sto sbagliando? Mi sono perso qualcosa?
Alessandro Del Sole [MVP]
Team
Team
Posts:121
Avatar

--
21 giu 2010 01:16  
Il punto è questo: è vero, i vari CanExecute vengono invocati molte volte. Ma il dispatcher di WPF è progettato in modo così intelligente che il thread UI non risente minimamente del lavoro svolto dietro le scene, per questo non te ne accorgi neanche.

Generalmente CommandManager.InvalidateRequerySuggest serve a "sporcare" il sistema di commanding affinchè lo stesso verifichi nuovamente l'eseguibilità dei comandi, che vuol dire, in altre parole, che tutti i CanExecute vengano invocati di nuovo. Non so dirti come mai il tuo pulsante non si riabiliti, bisognerebbe vedere il codice di CanExecute, come viene fatto il binding... tutto il contesto insomma, mentre posso dirti che quel codice che stai usando non fa altro che duplicare un lavoro che WPF fa già per te.

Alessandro Del Sole (WPF T&T Team)
Microsoft MVP - Visual Basic: Development
http://community.visual-basic.it/Alessandro
You are not authorized to post a reply.

Active Forums 4.2
  
hd porn
 
© 2009-2011 WPF Tips&Tricks Team - Visual Basic Tips&Tricks Network
 
porno izleporno izle