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

  • 相关阅读:
    关于hadoop中datanode节点不同的dfs.data.dir之间数据均衡问题
    数据挖掘话题识别
    BlockTransferThrottler(hadoop中用于控制处理带宽的util类)
    调试工具BTrace 的使用例子
    关于源代码的阅读
    java中String的基本知识以及例子
    java中内存的使用
    MySql数据库操作遇到的蛋疼二三事
    在WCF中使用Ninject轻量级IOC框架 之 SOAP风格服务
    Socket实现发布订阅
  • 原文地址:https://www.cnblogs.com/guxin/p/wpf-binding-property-change-but-ui-not-updating.html
Copyright © 2011-2022 走看看