【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中,方便給控制層調用以便於增加/減少。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM