2010-11-29 6 views
6

tengo un botón unido a un ICommandBotones parece desactivado hasta que haga clic algo

<Button Content="Remove" Command="{Binding RemoveCommand}" x:Name="btnRemove" Visibility="Collapsed" /> 

Después de algunas tareas se realiza, hice el botón visible, excepto que ven desactivado hasta que haga clic algo, ¿por qué ¿es eso? El RemoveCommand se parece a continuación

public ICommand RemoveCommand 
{ 
    get 
    { 
     if (_removeCommand == null) 
     { 
      _removeCommand = new RelayCommand(() => 
      { 
       if (RemoveRequested != null) 
        RemoveRequested(this, EventArgs.Empty); 
      },() => 
      { 
       // CanExecute Callback 
       if (Status == WorkStatus.Processing || Status == WorkStatus.Pending) 
       { 
        Debug.WriteLine("Returning False" + Status); return false; 
       } 
       Debug.WriteLine("Returning True"); return true; // After uploads, this returns True, in my Output Window. 
      }); 
     } 
     return _removeCommand; 
    } 

después de las subidas, la CanExecute devolución de llamada devuelve True, por lo que el botón debe estar habilitado, pero parece desactivado hasta que haga clic en algo, ¿por qué sucede esto?

Video of the Problem

Respuesta

5

Trate CommandManager.InvalidateRequerySuggested().

Este método debe llamar al CanExecute() en los comandos y eso debería actualizar el IsEnabled de sus botones.

Consulte http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx para obtener más información.

+0

Ya lo tengo en el colocador de estado http://pastebin.com/w6901n06 –

+0

Hace bastante tiempo que formulé esta pregunta, pero estoy teniendo el mismo problema que @jiewmeng. Llamo explícitamente a InvalidateRequerySuggested(), pero aún no se actualiza hasta que realizo un cambio de enfoque. jiewmeng, ¿alguna vez encontraste una solución a esto? – RustyTheBoyRobot

0

Si CommandManager.InvalidateRequerySuggested() no hace el trabajo, trate de forzar el foco en el control que contiene los botones en el momento apropiado (MouseEnter, Cargado ...):

//void ParentControl_MouseEnter(object sender, MouseEventArgs e) 
void ParentControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    this.Focusable = true; 
    this.Focus(); 
} 

Puede que no sea la solución más elegante pero funcionó para mí

Cuestiones relacionadas