首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

MVVM怎么实现UI线程的实时刷新

2013-09-28 
MVVM如何实现UI线程的实时刷新我用了MVVMlight,有个问题,我在model里声明了一个ObservableCollectionstri

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里边的主要代码不应该主线程上执行。

热点排行