У меня был похожий сценарий только на этой неделе (MVVM здесь также). У меня был отдельный класс, который делал свое дело, сообщая о состоянии обработчика событий. Обработчик события вызывался, как и ожидалось, и я мог видеть, что результаты возвращаются точно в срок с помощью Debug.WriteLine .
Но с WPF, что бы я ни делал, пользовательский интерфейс не обновлялся до завершения процесса. Как только процесс завершится, пользовательский интерфейс будет обновлен, как и ожидалось. Это было так, как будто он получал PropertyChanged, но ожидал завершения потока, прежде чем выполнять обновления интерфейса пользователя сразу.
(К моему ужасу, тот же код в Windows. Формы с DoEvents и .Refresh () работали как чудо.)
Пока что я решил эту проблему, запустив процесс в своем собственном потоке:
//hook up event handler
myProcess.MyEvent += new EventHandler<MyEventArgs>(MyEventHandler);
//start it on a thread ...
ThreadStart threadStart = new ThreadStart(myProcess.Start);
Thread thread = new Thread(threadStart);
thread.Start();
и затем в обработчике событий:
private void MyEventHandler(object sender, MyEventArgs e) {
....
Application.Current.Dispatcher.Invoke(
DispatcherPriority.Send,
(DispatcherOperationCallback)(arg =>
{
//do UI updating here ...
}), null);
Я не рекомендую этот код, так как я все еще пытаюсь понять модель потока WPF, как работает Dispatcher и почему в моем случае пользовательский интерфейс не будет обновляться до тех пор, пока процесс не будет завершен даже после вызова обработчика события. как и ожидалось (по замыслу?). Но до сих пор это работало для меня.
Мне показались полезными эти две ссылки:
http://www.nbdtech.com/blog/archive/2007/08/01/Passing-Wpf-Objects-Between-Threads-With-Source-Code.aspx
http://srtsolutions.com/blogs/mikewoelmer/archive/2009/04/17/dealing-with-unhandled-exceptions-in-wpf.aspx