zoukankan      html  css  js  c++  java
  • 【WPF】修改数据层ViewModel后,UI界面未同步更新

    界面: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中,方便给控制层调用以便于增加/减少。

  • 相关阅读:
    现代物流系统及其输送机构
    什么是线性插值原理 什么是双线性插值?
    Windows常见窗口样式和控件风格
    CAsyncSocket
    使用CRectTracker类进行对象动态定位
    英文自我介绍
    QQ 静态截图程序模拟实现
    使用CRectTracker类进行对象动态定位
    QQ 静态截图完善实现之改造 CRectTracker 类
    [原创] 骨骼运动变换的数学计算过程详解
  • 原文地址:https://www.cnblogs.com/guxin/p/wpf-binding-property-change-but-ui-not-updating.html
Copyright © 2011-2022 走看看