欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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{ } )); 是因为我在另一个线程中操作。如果是在主线程中更改前端,则不用写这个。