Текст метки обновления WPF MVVM

Текст моей метки не обновляется должным образом в моем приложении 3.5 WPF MVVM. Часть выполнения работы длится достаточно долго, чтобы вы могли видеть ожидающий указатель мыши. Все, что я когда-либо видел, это «Parsed» в метке, которая привязана к InfoText. Строки Dispatcher и do work находятся в методе 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");
        }
    }

person mike    schedule 17.03.2011    source источник


Ответы (2)


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

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

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

     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");
     });
person Robert Jeppesen    schedule 17.03.2011
comment
Сам как раз собирался это опубликовать - person AndrewS; 17.03.2011
comment
как бы я сделал это в другом потоке? просто как новый поток();? - person mike; 17.03.2011
comment
это работает, но теперь у меня проблемы с этим типом CollectionView не поддерживает изменения в его SourceCollection из потока, отличного от потока Dispatcher - person mike; 17.03.2011
comment
строки кода, которые изменяют вашу коллекцию, теперь должны быть в Application.Current.Dispatcher.BeginInvoke(new Action(() =› { //здесь идут ваши строки кода, которые изменяют вашу коллекцию};));, потому что коллекция назначается потоку пользовательского интерфейса. но обратите внимание, что вы не делаете в нем длинных вещей, иначе пользовательский интерфейс снова зависает;) возможно, вам следует опубликовать свой код dowork, чтобы дать вам лучшую информацию - person blindmeis; 17.03.2011

 Application.Current.Dispatcher.BeginInvoke(new Action(() => this.InfoText="Start Parsing"));

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

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

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

person blindmeis    schedule 17.03.2011