title: CommandManager.InvalidateRequerySuggested() isn't fast enough. What can I do?
body: <h2><strong>Short Version</strong></h2>
  
  <p>Calls to <code>CommandManager.InvalidateRequerySuggested()</code> take far longer to take effect than I would like (1-2 second delay before UI controls become disabled).</p>
  
  <h2><strong>Long Version</strong></h2>
  
  <p>I have a system where I submit tasks to a background-thread based task processor. This submit happens on the WPF UI thread.</p>
  
  <p>When this submit happens, the object that manages my background thread does two things:</p>
  
  <ol>
  <li><p>It raises a "busy" event (still on the UI thread) that several view models respond to; when they receive this event, they set an <code>IsEnabled</code> flag on themselves to <code>false</code>. Controls in my views, which are databound to this property, are immediately grayed out, which is what I would expect.</p></li>
  <li><p>It informs my WPF <code>ICommand</code> objects that they should not be allowed to execute (again, still on the UI thread). Because there is nothing like <code>INotifyPropertyChanged</code> for <code>ICommand</code> objects, I am forced to call <code>CommandManager.InvalidateRequerySuggested()</code> to force WPF to reconsider all of my command objects' <code>CanExecute</code> states <em>(yes, I actually do need to do this: otherwise, none of these controls become disabled)</em>. Unlike item 1, though, it takes a significantly longer time for my buttons/menu items/etc that are using <code>ICommand</code> objects to visually change to a disabled state than it does for the UI controls that have their <code>IsEnabled</code> property manually set.</p></li>
  </ol>
  
  <p>The problem is, from a UX point of view, this looks <strong>awful</strong>; half of my controls are immediately grayed out (because their <code>IsEnabled</code> property is set to false), and then a full 1-2 seconds later, the other half of my controls follow suit (because their <code>CanExecute</code> methods are finally re-evaluated).</p>
  
  <p><strong><em>So, part 1 of my question:</em></strong><br>
  As silly as it sounds to ask, is there a way I can make <code>CommandManager.InvalidateRequerySuggested()</code> do it's job faster? I suspect that there isn't.</p>
  
  <p><strong><em>Fair enough, part 2 of my question:</em></strong><br>
  How can I work around this? I'd prefer all of my controls be disabled at the same time. It just looks unprofessional and awkward otherwise. Any ideas? :-)</p>