Текст метки обновления WPF MVVM - PullRequest
0 голосов
/ 17 марта 2011

Текст моего ярлыка не обновляется должным образом в моем приложении 3.5 WPF MVVM. Часть do work длится достаточно долго, чтобы вы могли видеть ожидающий указатель мыши. Все, что я когда-либо вижу, это "Parsed" в метке, которая привязана к InfoText. Диспетчер и рабочие строки do находятся в методе Command. Идеи?

код

Dispatcher.Invoke((Action<string>)SetInfoText, "Start Parsing");
//do work
 Dispatcher.Invoke((Action<string>)SetInfoText, "Parsed");

 private void SetInfoText(string text)
    {
        InfoText = text;
    }

  private string _infoText;
    public string InfoText
    {
        get
        {
            return _infoText;
        }
        set
        {
            _infoText = value;
            OnPropertyChanged("InfoText");
        }
    }

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Единственное, что я могу объяснить, это то, что вы выполняете работу в потоке пользовательского интерфейса.Это предотвратит перерисовку диспетчера, пока ваша работа не будет завершена.Передаваемая в Invoke работа помещается в очередь событий, что означает, что она будет выполняться в режиме ожидания.

Правильный способ исправить это - выполнить работу в отдельном потоке.Если вы ищете обходные пути, посмотрите здесь .Ссылка: MSDN

РЕДАКТИРОВАТЬ: Есть много способов выполнить работу в другом потоке.Читайте о BackgroundWorker, ThreadPool, Task Parallell Library, потоках.:) Вот действительно простой способ выполнить работу в фоновом потоке:

     System.Threading.ThreadPool.QueueUserWorkItem( state => 
     {
        Dispatcher.Invoke((Action<string>)SetInfoText, "Start Parsing");
        System.Threading.Thread.Sleep(5000); // Simulate work
        Dispatcher.Invoke((Action<string>)SetInfoText, "Parsed");
     });
0 голосов
/ 17 марта 2011
 Application.Current.Dispatcher.BeginInvoke(new Action(() => this.InfoText="Start Parsing"));

это работает для меня.

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

edit: если вы выполняете всю свою работу в потоке пользовательского интерфейса, вы должны посмотреть на перегрузку для BeginInvoke - вы можете передать DispatcherPriority.может быть, это тоже помогает

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