Я уже искал форум, но ни один из заданных вопросов не подходит к моей проблеме, я думаю ...
Я использую BackgroundWorker для обработки очень трудоемкой операции. После завершения этой операции кнопка должна быть включена, чтобы пользователь мог выполнить другую операцию.
Я использую WPF и следую шаблону MVVM, поэтому у меня нет прямого доступа к этой кнопке. Мне нужно вызвать метод в обработчике события BackgroundWorker_RunWorkerCompleted, который устанавливает свойство, представляющее состояние включенного кнопки, в значение true.
Это все отлично работает, кроме одного: кнопка перерисовывается только после того, как я, например. щелкните в окне (или разверните окно, ...). Это очень раздражало и заняло у меня целый день, чтобы избавиться от этого поведения, но я не могу найти решение ...
Обработчик события BackgroundWorker_RunWorkerCompleted выглядит следующим образом:
void fileLoadBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
SetButtonToEnabled(); }
Кто-нибудь знает, как решить эту проблему?
Edit:
Кнопка привязана к команде:
<Button Name="btnLoadTargetFile" Command="{Binding Path=LoadTargetCommand}" .../>
Эта команда является RelayCommand, как сказал Смит в своем блоге (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx), и выглядит так:
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 устанавливается в true с помощью SetButtonToEnabled (); Метод
Редактировать 2:
следующий код 'работает':
fileLoadBackgroundWorker.RunWorkerAsync(argumentList);
while(fileLoadBackgroundWorker.IsBusy)
System.Windows.Forms.Application.DoEvents();
SetButtonToEnabled();
но это какой-то действительно опасный и уродливый код ...