Tengo una aplicación WPF que simplemente contiene un botón y un cuadro de texto para mostrar algunos resultados. Cuando el usuario hace clic en el botón, se inicia un hilo que desactiva el botón, imprime cosas en el cuadro de texto de salida, luego el hilo se detiene (en este punto quiero que el botón se habilite de nuevo).WPF: Problemas para controlar el estado de un botón habilitado/deshabilitado mediante el enlace de comandos y un hilo
La aplicación parece desactivar el botón correctamente, así como actualizar el cuadro de texto correctamente. Sin embargo, siempre falla al volver a habilitar el botón correctamente cuando se completa el hilo. ¿Alguien puede decirme lo que estoy haciendo mal?
He aquí un fragmento de mi xaml:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Grid.Row="0" HorizontalAlignment="Center" Command="{Binding ExecuteCommand}">E_xecute</Button>
<Label Grid.Row="1" Content="Output Window:" HorizontalAlignment="Left"/>
<TextBlock Grid.Row="2" Text="{Binding Output}"/>
</Grid>
Aquí está mi código de modelo de vista (estoy usando el diseño MVVM de Josh Smith):
public class WindowViewModel : ViewModelBase
{
private bool _threadStopped;
private RelayCommand _executeCommand;
private string _output;
public WindowViewModel()
{
_threadStopped = true;
}
public string Output { get { return _output; } set { _output = value; OnPropertyChanged("Output"); } }
public ICommand ExecuteCommand
{
get
{
if (_executeCommand == null)
{
_executeCommand = new RelayCommand(p => this.ExecuteThread(p), p => this.CanExecuteThread);
}
return _executeCommand;
}
}
public bool CanExecuteThread
{
get
{
return _threadStopped;
}
set
{
_threadStopped = value;
}
}
private void ExecuteThread(object p)
{
ThreadStart ts = new ThreadStart(ThreadMethod);
Thread t = new Thread(ts);
t.Start();
}
private void ThreadMethod()
{
CanExecuteThread = false;
Output = string.Empty;
Output += "Thread Started: Is the 'Execute' button disabled?\r\n";
int countdown = 5000;
while (countdown > 0)
{
Output += string.Format("Time remaining: {0}...\r\n", countdown/1000);
countdown -= 1000;
Thread.Sleep(1000);
}
CanExecuteThread = true;
Output += "Thread Stopped: Is the 'Execute' button enabled?\r\n";
}
}
He colocado la línea de código como sugirió, pero el botón aún aparece deshabilitado cuando termina la secuencia. Solo cuando le doy foco a algo dentro de la ventana (es decir, un clic del mouse o una tecla de atajo), el botón se vuelve a habilitar. (NOTA: Sin embargo, estaba viendo esto incluso antes de su solución sugerida). Cualquier otra sugerencia sería muy apreciada. –
Trate de hacerlo en el hilo de la interfaz de usuario a través de un Dispatcher.Invocar llamada –
¡Gracias, Kent! Eso lo hizo! Voy a publicar la respuesta para que otros vean la solución. –