WPF Listview繫結資料發生改變後前端沒有更新
阿新 • • 發佈:2018-12-03
前端沒有更新的原因:
1.將控制元件與列表繫結
ICMask.ItemsSource = _poppingWordList;
2.在更新繫結資料時
_poppingWordList = newWordList;
因為List是引用,這樣是將_poppingWordList的指向的列表更換了,而ICMask.ItemsSource指向的列表並沒有更新。
我的解決方法:
方法一:重新繫結
private ObservableCollection<PoppingWord> _poppingWordList=new ObservableCollection<PoppingWord>(); public ObservableCollection<PoppingWord> _PoppingWordList { get { return _poppingWordList; } set { if (value == null || value.Count < 1) return; //重新繫結 _poppingWordList = value; ICMask.ItemsSource = _poppingWordList; } }
將list與_poppingWordList繫結,用_PoppingWordList對_poppingWordList封裝,_PoppingWordList在收到賦值以後,將_poppingWordList重新繫結到ICMask上。
方法二:不對整個列表賦值,將繫結的列表清空再新增
private ObservableCollection<PoppingWord> _poppingWordList=new ObservableCollection<PoppingWord>(); public ObservableCollection<PoppingWord> _PoppingWordList { get { return _poppingWordList; } set { if (value == null || value.Count < 1) return; Dispatcher.BeginInvoke(new Action(delegate { //清空原先的列表 _poppingWordList.Clear(); //向列表中加入單詞塊 foreach(PoppingWord poppingWord in value) { _poppingWordList.Add(poppingWord); } })); } }
用_PoppingWordList對_poppingWordList封裝,_PoppingWordList在收到新的值後將新列表的元素新增到_poppingWordList中,也就是新增到列表的ItemsSource中。
注意:
1.列表不能用List<T>,而應該用ObservableCollection<T>,這樣控制元件的ItemsSource更新以後,前端才會重新整理。
2.我使用
Dispatcher.BeginInvoke(new Action(delegate{ } )); 是因為我在另一個執行緒中操作。如果是在主執行緒中更改前端,則不用寫這個。