概述
界面:WPF(MVVM)中将集合类控件ItemsControl的ItemsSource绑定到了ViewModel中的ObservableCollection列表,ItemsControl.ItemTemplate模板中是一个Image图片控件。
问题:当数据层发生改变,例如列表新增一个元素后,若之后执行的代码想要立即获取到新增图片Image,会发现此时的UI层还未同步更新,不能获取新增的Image控件。即WPF的这种UI绑定数据的机制下,UI的更新是延迟的,而我不清楚UI到底什么时候更新的,找不到UI更新完成的回调。
解决办法:想到的一个办法是利用Image控件的Loaded事件。当触发Loaded事件时,即是UI层完成更新之时。于是准备一个计数器imageCount在Loaded事件中自增,当imageCount等于数据层ViewModel中ObservableCollection列表的count时,即是UI层完成更新,与数据层同步之时。(列表新增N个元素,数据层的更新是瞬间的,而UI层要一个一个的加载新增的Image控件。)
后台代码:
// 每层图片加载完成后计数,当计数等于图片层数时默认加载全部完成,做完成回调 private void DesignImage_Loaded(object sender, RoutedEventArgs e) { lock (lockObj) {
if (imageCount == this.DesignControl.ItemContainerGenerator.Items.Count) // DesignControl是控件ItemsControl { imageCount = 0; // do something } } }
这只是处理了增加图片的情况。如果ViewModel中列表元素减少,即是想要删除图片列表中的部分图片,此时还需要将该计数器imageCount减少。
如果增加/删除列表元素的操作都在控制层,那么最好是将imageCount放到ViewModel中,方便给控制层调用以便于增加/减少。
最后
以上就是开朗自行车为你收集整理的【WPF】修改数据层ViewModel后,UI界面未同步更新的全部内容,希望文章能够帮你解决【WPF】修改数据层ViewModel后,UI界面未同步更新所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复