Ya busqué en el foro pero ninguna pregunta se ajusta a mi problema, creo ...¿Por qué BackgroundWorker_RunWorkerCompleted no actualiza la GUI?
Uso un BackgroundWorker para manejar una operación que consume mucho tiempo. Una vez que finaliza esta operación, un botón debe configurarse como habilitado para que el usuario pueda realizar otra operación.
Estoy usando WPF y estoy siguiendo el patrón de MVVM, por lo que no tengo acceso directo a este botón. Tengo que llamar a un método en el controlador de eventos BackgroundWorker_RunWorkerCompleted que establece una propiedad, que representa los botones estado habilitado, en verdadero.
Todo funciona bien excepto una cosa: el botón solo se vuelve a dibujar después de que p. Ej. haga clic en la ventana (o maximice la ventana, ...). Eso es muy molesto y me llevó todo el día para deshacerse de este comportamiento, pero no puedo encontrar una solución ...
El controlador de eventos BackgroundWorker_RunWorkerCompleted se parece a esto:
void fileLoadBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
SetButtonToEnabled(); }
Alguien alguna idea de cómo para arreglar este problema?
Editar:
El botón está vinculado a un comando:
<Button Name="btnLoadTargetFile" Command="{Binding Path=LoadTargetCommand}" .../>
Este comando es un RelayCommand como Smith declaró en su blog (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) y se ve así:
public RelayCommand LoadTargetCommand
{
get
{
if (loadTargetCommand == null)
{
loadTargetCommand = new RelayCommand(param => this.OnRequestLoadFile(BusinessLogic.CustomTypes.TreeType.Target), param => this.CanLoadTarget);
}
return loadTargetCommand;
}
set { loadTargetCommand = value; }
}
this.CanLoadTarget está establecido en true por SetButtonToEnabled(); Método
Edición 2:
el siguiente código 'funciona':
fileLoadBackgroundWorker.RunWorkerAsync(argumentList);
while(fileLoadBackgroundWorker.IsBusy)
System.Windows.Forms.Application.DoEvents();
SetButtonToEnabled();
pero que es algún tipo de código realmente peligroso y feo ...
Cuando establece la propiedad en verdadero, plantea el evento 'PropertyChanged' (es decir, ¿su modelo de vista implementa' INotifyPropertyChanged' correctamente)? –
Si llamo a ese método después de fileLoadBackgroundWorker.RunWorkerAsync() todo funciona bien, así que no creo que ese sea el problema? – lakai
Solo por curiosidad, ¿está utilizando alguna modificación de WMI en la forma o el borde del formulario (color del borde, etc.)? –