我正在使用ListView控件来显示一些数据行。有一个后台任务,该任务接收列表内容的外部更新。新接收的数据可能包含更少,更多或相同数量的项目,并且项目本身可能已经更改。
ListView.ItemsSource绑定(bind)到OberservableCollection(_itemList),因此对_itemList的更改也应该在ListView中可见。

_itemList = new ObservableCollection<PmemCombItem>();
_itemList.CollectionChanged += new NotifyCollectionChangedEventHandler(OnCollectionChanged);
L_PmemCombList.ItemsSource = _itemList;

为了避免刷新整个ListView,我将新检索到的列表与当前_itemList进行简单比较,更改不相同的项目,并在必要时添加/删除项目。集合“newList”包含新创建的对象,因此替换_itemList中的项目将正确发送“刷新”通知(我可以使用ObservableCollection`的事件处理程序OnCollectionChanged进行记录)
Action action = () =>
{
    for (int i = 0; i < newList.Count; i++)
    {
        // item exists in old list -> replace if changed
        if (i < _itemList.Count)
        {
            if (!_itemList[i].SameDataAs(newList[i]))
                _itemList[i] = newList[i];
        }
        // new list contains more items -> add items
        else
            _itemList.Add(newList[i]);
     }
     // new list contains less items -> remove items
     for (int i = _itemList.Count - 1; i >= newList.Count; i--)
         _itemList.RemoveAt(i);
 };
 Dispatcher.BeginInvoke(DispatcherPriority.Background, action);

我的问题是,如果在此循环中更改了许多项目,则ListView不会刷新,并且屏幕上的数据保持原样……这是我不理解的。

甚至更简单的版本(交换所有元素)
List<PmemCombItem> newList = new List<PmemCombItem>();
foreach (PmemViewItem comb in combList)
    newList.Add(new PmemCombItem(comb));

if (_itemList.Count == newList.Count)
    for (int i = 0; i < newList.Count; i++)
        _itemList[i] = newList[i];
else
{
    _itemList.Clear();
    foreach (PmemCombItem item in newList)
        _itemList.Add(item);
}

工作不正常

有什么线索吗?

更新

如果我在更新所有元素后手动调用以下代码,则一切正常
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));

但这当然会导致UI更新我仍然要避免的所有内容。

最佳答案

这是我必须要做的,才能使其正常工作。

MyListView.ItemsSource = null;
MyListView.ItemsSource = MyDataSource;

关于c# - WPF ListView : Changing ItemsSource does not change ListView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20996288/

10-17 02:38