以编程方式移动UWP ListView中的项目而不刷新

时间:2018-05-02 10:49:12

标签: uwp

以下问题让我现在忙了很长一段时间,它似乎是如此基本,但它只是不起作用。归结为:

  • 将ListView绑定到后面的代码中的某个合适的集合(ObservableCollection,ReactiveList或类似的)
  • 我每隔x秒一次移动一件物品
  • 在每一个动作中,所有项目都会刷新(至少它看起来像那样。一瞬间所有项目都会消失,然后重新出现在新订单中)

必须有一种方法来保持其他元素,并且只需要移动"移动的项目。我甚至不关心移动项目的奇特翻译动画,我只是希望其他元素留在屏幕上。 当然,我的真实用例不是随机移动项目,而是在后面的代码中对列表进行排序。但我将问题追溯到这个简单的案例。

有一个简单的ListView并让它绑定例如到CodeBehind中的ObservableCollection,下面是我的虚拟代码来移动项目:

_timer = new Timer(async _ =>
{
    Random r = new Random();
    var randomIndex = r.Next(0, contactsCvsSource.Count - 1);

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { contactsCvsSource.Move(randomIndex, 5); });
}
, null, 0, 1000);

1 个答案:

答案 0 :(得分:0)

  

在每一个动作中,所有项目都会刷新(至少它看起来像那样。一瞬间所有项目都会消失,然后重新出现在新订单中

Move ObservableCollection方法用于提高UI刷新性能。当Move方法调用时,UI元素哈希值不会改变,它只刷新ListView并且没有重新创建。

  

我只想让其他元素留在屏幕上。当然,我的真实用例不是随机移动项目,而是在后面的代码中对列表进行排序。

根据您的要求,您可以通过InsertRemove方法实现此功能。

var _timer = new Timer(async _ =>
 {
     Random r = new Random();
     var randomIndex = r.Next(0, Items.Count - 1);
     await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
         Items.Insert(5,Items[randomIndex] );
         Items.RemoveAt(randomIndex);                   
     });
 }
 , null, 0, 1000);