1. 程式人生 > >WPF Listview繫結資料發生改變後前端沒有更新

WPF Listview繫結資料發生改變後前端沒有更新

前端沒有更新的原因:

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{ } )); 是因為我在另一個執行緒中操作。如果是在主執行緒中更改前端,則不用寫這個。