日期:2014-05-17  浏览次数:21579 次

MVVM如何实现UI线程的实时刷新
我用了MVVMlight,有个问题,我在model里声明了一个ObservableCollection<string> Logs,在VM里也做了对应的,界面里也用LISTBOX绑定了这个,在界面里有个按钮绑定了一个relaycommand Addlog,这个command直接调用model里的一个方法,会随时间增加而添加字符串到Logs里面去,这个会持续比较长的时间,这时问题来了,每次点击这个按钮后界面都没反应,一直要等到这个方法完成了才会把所有的Logs显示出来,而我是想它实时显示的。
这个应该是处理线程和UI线程的问题,在没使用MVVM的时候可以用界面元素的Dispatcher来处理,而使用MVVM后,VM是不知道界面元素的,应该怎么做呢,特别是在mvvmlight下?

------解决方案--------------------
1.Dispatcher只是入列。最后还是有UI线程调用的,所以如果你操作函数,中涉及到长时间的执行。那么肯定堵塞无法直接更新UI数据显示的
2.如果想调用UI的dispatcher,你可以考虑使用
System.Windows.Threading.Dispatcher.CurrentDispatcher

操作时候请添加一个CheckAccess判断
3.对你的问题,我的解决方法是使用TPL,如果你在你操作中,每次操作行为/或者操作对象都是相对独立的情况下,我很推荐你使用,比如说,一个方法保护对ListBox的更新,ListView的更新已经一个漫长的数据库操作等,这种情况下TPL是个不错的选择
4.New thread不是很推荐的操作

ps:
 项目中没有必要使用完整的Mvvm框架,最好根据自己的需要来定制ViewModel
------解决方案--------------------
Application.Current.Dispatcher
------解决方案--------------------
就直接用System.Threading.Thread来做。

传统的线程模型,wpf也一样支持。
------解决方案--------------------
更新界面数据用主线程.
其余的用新建子线程
------解决方案--------------------
引用:
更新界面数据用主线程.
其余的用新建子线程


是这样的。

relaycommand Addlog里边的主要代码不应该主线程上执行。