Andrew Connell [MVP SharePoint]
1741 Posts |  46 Articles |  5310 Comments
.NET  |  MCMS  |  SharePoint  |  Office System
Andrew Connell's RSS Feed    
AC's Blog Quick Links
SharePoint Quick Links
Article Categories
Archives
May, 2012 (3)
April, 2012 (4)
March, 2012 (4)
February, 2012 (4)
January, 2012 (12)
December, 2011 (6)
November, 2011 (3)
October, 2011 (17)
September, 2011 (8)
August, 2011 (6)
July, 2011 (7)
June, 2011 (13)
May, 2011 (9)
April, 2011 (15)
March, 2011 (1)
February, 2011 (6)
January, 2011 (5)
December, 2010 (11)
November, 2010 (6)
October, 2010 (12)
September, 2010 (5)
August, 2010 (4)
July, 2010 (5)
June, 2010 (6)
May, 2010 (11)
April, 2010 (11)
March, 2010 (9)
February, 2010 (9)
January, 2010 (3)
December, 2009 (10)
November, 2009 (15)
October, 2009 (15)
September, 2009 (7)
August, 2009 (4)
July, 2009 (10)
June, 2009 (8)
May, 2009 (2)
April, 2009 (9)
March, 2009 (6)
February, 2009 (16)
January, 2009 (6)
December, 2008 (12)
November, 2008 (12)
October, 2008 (27)
September, 2008 (13)
August, 2008 (14)
July, 2008 (14)
June, 2008 (12)
May, 2008 (23)
April, 2008 (12)
March, 2008 (15)
February, 2008 (13)
January, 2008 (12)
December, 2007 (10)
November, 2007 (8)
October, 2007 (15)
September, 2007 (20)
August, 2007 (21)
July, 2007 (16)
June, 2007 (8)
May, 2007 (25)
April, 2007 (16)
March, 2007 (18)
February, 2007 (18)
January, 2007 (12)
December, 2006 (16)
November, 2006 (13)
October, 2006 (18)
September, 2006 (22)
August, 2006 (27)
July, 2006 (23)
June, 2006 (23)
May, 2006 (23)
April, 2006 (9)
March, 2006 (17)
February, 2006 (15)
January, 2006 (23)
December, 2005 (31)
November, 2005 (32)
October, 2005 (38)
September, 2005 (53)
August, 2005 (30)
July, 2005 (63)
June, 2005 (30)
May, 2005 (59)
April, 2005 (29)
March, 2005 (74)
February, 2005 (27)
January, 2005 (22)
December, 2004 (32)
November, 2004 (42)
October, 2004 (39)
September, 2004 (20)
August, 2004 (14)
July, 2004 (27)
June, 2004 (40)
May, 2004 (5)
April, 2004 (6)
March, 2004 (16)
February, 2004 (26)
January, 2004 (23)
December, 2003 (7)
November, 2003 (14)
October, 2003 (20)
September, 2003 (4)
Post Categories



Managed Windows Shared Hosting

In a few recent posts I blogged about how you handle events using the commanding framework when someone clicks a button or another control in the SharePoint 2010 ribbon as well as how you can implement this using a custom page component. As I mentioned, one of the aspects of the commanding framework is that you can have your command specify when it is and is not available. The SharePoint ribbon command manager checks the commands to see if they are or aren't available at given times. When a command is not available, the button is disabled (grayed out) in the ribbon and cannot be clicked. This facilitates a good user experience.

You implement this in one of two ways depending on how you implemented your event handling. If you do it declaratively you use the <CommandUIHandler EnabledScript="" /> attribute. If you do it with a page component you do it with the canHandleCommand() method in the client-side object. For the sake of this post let's just refer to these as the "can execute handlers" of the command (that's what WPF & Silverlight 4 call it in their commanding implementations). Sounds easy, but what if…

The Challenge...

What if you need to make a call back to some resource to see if the command should or shouldn't be enabled? Well, because it's JavaScript (err… ECMAScript... excuuuusssseeeemeeee), the call has to be async. OK, so what's the big deal? Well, if it's async, then you just left the command. When your check finishes, how are you supposed to tell the ribbon "hey, come back here and check the status of the command to see if it is or isn't available."

The Solution!

Ah, there's a solution for this (no, not some *.wsp with a bunch of junk in it). Here's what you'll need to do. After you issue your async call in the can execute handler, you need to return FALSE back to the ribbon to essentially tell the ribbon "I'm not sure if this command is available right now, but for now, let's just say it isn't while I check."

Then, when your async call completes, if the command is available, change the value of some private JavaScript variable from FALSE to TRUE. You then need to tell the ribbon "hey, come back and check this command's can execute handler". To do this you need to raise the JavaScript event ApplicationStateChanged in the ribbon which can be done by calling the RefreshCommandUI() method. This will tell the ribbon to go back and check if the command is available or not. So you need to go back into your can execute handler and add some logic to check this variable instead of blindly returning FALSE. Just be careful because you may need to add a bit more logic in your handler to make sure the value is refreshed every time state changes (like if an item is selected in a list in the ribbon).

One Parting Thought…

Because you're likely going to want to use some private JavaScript variables for your page component, you're likely going to want to make sure these are localized and available to your command and only your command. In that case you're pretty much pushed into the direction of implementing your command as a page component as that’s the only option that lets you have a true client-side object whereas the <CommandUIHandler /> way is a bit more ad-hoc and loose.

posted on Thursday, October 14, 2010 6:33 AM

Feedback

# re: Asynchronously Checking if a Command is Available in the SharePoint Ribbon 11/19/2010 10:15 AM akshay
Gravatar Great Post Andrew, as always the article is very good

Post Feedback

Title:
Name:
Email:
(email will not be displayed)
Url:
Comments: 
Please add 8 and 2 and type the answer here:    
All Comments Are Filtered & Moderated
Unfortunately comment spammers are just too effecient and are constantly dirtying up blogs with irrelevant and unwanted comments trying to improve their standing on search engines. All comments on this blog are moderated. I do not censor comments, but I don't approve comments with vulger language or those soliciting products. Most of the time comments are approved within a few hours of being submitted with the only exception when I'm traveling.

Why are you asking for my email address?
The only reason I'm asking for your email address, which isn't required to submit a comment, is to provide a gravatar if you've created an account for yourself and associated your email address with a small image. If you have a gravatar created for the email address you submit, it will appear next to your comment. Otherwise nothing will appear.

What is a gravatar?
A gravatar is a "globally recognized avatar." You can get more information about gravatars, as well as create your own for free, at www.gravatar.com. You can also view my gravatar here.


Copyright © 2003 - 2012 Andrew Connell
Creative Commons License 
This work is licensed under a Creative Commons License

 
SharePoint Training
Looking for SharePoint 2010 training for developers, administrators, power users, information workers, end users & web designers? Look no further! My company, Critical Path Training offers the best SharePoint training around! We offer public & private classes both as in-person instructor-loed hands-on classes and online classes. Check out our schedule and course catalog for all the ways we can get you going on your SharePoint path!