Как вручную обновить окно в WPF? - PullRequest
3 голосов
/ 16 августа 2010

Я использую интерфейс ICommand для привязки пары кнопок в моем приложении, кнопки «Выполнить» и «Закрыть». Я использую вспомогательный метод, который был упомянут в этом вопросе, чтобы подключить ICommand к делегату следующим образом:

_someCommand = new DelegateCommand(this.DoSomething, this.CanDoSomething);

private ICommand _someCommand;

public ICommand SomeCommand
{
    get { return _someCommand; }
}

private void DoSomething(object state)
{
    // do something here
}

private bool CanDoSomething(object state)
{
    // return true/false here is enabled/disable button
}

Кажется, это работает просто отлично, так как в моей реализации CanDoSomething возвращает значение свойства, которое есть в моем приложении.

Если я установлю начальное значение свойства в true, то кнопка будет включена, а в false она отключена.

У меня есть ряд событий, которые вызываются из BackgroundWorker на уровне приложения обратно в ViewModel, которые изменяют значение свойства на true или false в зависимости от текущего состояния приложения.

Текущая проблема, с которой я сталкиваюсь, заключается в том, что кнопка не «повторно активируется», когда я устанавливаю значение true после завершения работы. Если я щелкну где-нибудь в окне, оно обновится. Поэтому я думаю, что ручное обновление окна решит мою проблему, по крайней мере, на время. Это кажется немного грубым, если я делаю это таким образом, но я немного растерялся из-за того, что еще я мог бы попробовать.

Если у кого-нибудь есть предложения, я весь в ушах.

Спасибо за помощь!

Ian

Редактировать -

Немного больше информации о самом приложении. Он использует фоновый рабочий в потоке приложения для обработки «работы». Приложение представляет собой простую утилиту для управления созданием таблиц и загрузкой данных в таблицы. Мы используем множество предопределенных сценариев SQL для настройки нашей тестовой среды, поэтому это простая утилита, которая позволяет нам делать такие вещи на основе параметров, предоставленных пользователем в пользовательском интерфейсе.

Надеюсь, это поможет, потому что, когда я перечитывал свой вопрос, он читал так, как будто я делал все в потоке пользовательского интерфейса, что не так. Отчеты о ходе выполнения возвращаются обратно в поток пользовательского интерфейса, и все обновляется, как ожидается, кроме кнопки ..

Ответы [ 2 ]

4 голосов
/ 16 августа 2010

CommandManager.InvalidateRequerySuggested () может быть ответом - он говорит всем командам проверять, включены они или нет.

1 голос
/ 16 августа 2010

Вы должны вызвать событие CanExecuteChanged:

http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.canexecutechanged.aspx

Это может быть более полезным, чем другой ответ, в случаях, когда вы знаете, что вам следует переоценить один элемент управления, и повторная оценка всех элементов управления будет дорогостоящей. Другой ответ проще, если у вас нет такого случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...