WPF Listview绑定数据发生改变后前端没有更新
程序员文章站
2022-03-07 17:04:07
...
前端没有更新的原因:
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{ } )); 是因为我在另一个线程中操作。如果是在主线程中更改前端,则不用写这个。