【问题标题】:ListView does not update immediately after I add a new item to the ObservableCollection将新项目添加到 ObservableCollection 后,ListView 不会立即更新
【发布时间】:2020-03-23 01:53:56
【问题描述】:

我正在学习 Xamarin.Forms,并且我使用 Visual Studio 2019 创建了一个新项目,使用 Master-Detail 项目模板。我正在使用 UWP(因为我想制作一个 Windows 10 应用)。

为什么添加新项目后列表视图没有立即显示? 这是由事件/消息传递缓慢引起的,还是有动画故意减慢它的速度?

在这个示例中,一切都发生在本地 ObservableCollection 中,其中只有几项,所以我希望它能够立即显示更改。

例子:

代码是Visual Studio生成的,我可以提供,但我并没有真正做任何改变。

编辑: 由于我怀疑这与 ObservableCollection 生成的事件和 ListView 中的绑定有关,因此我尝试了以下更改,该更改有效:

MessagingCenter.Subscribe<NewItemPage, Item>(this, "AddItem", async (obj, item) =>
{
    var newItem = item as Item;
    Items.Add(newItem);
    await DataStore.AddItemAsync(newItem);
});

收件人:

MessagingCenter.Subscribe<NewItemPage, Item>(this, "AddItem", async (obj, item) =>
{
    var newItem = item as Item;
    var tmp = new ObservableCollection<Item>();
    foreach (var i in Items)
    {
        tmp.Add(i);
    }
    tmp.Add(newItem);
    Items = tmp;
    OnPropertyChanged(nameof(Items));
    await DataStore.AddItemAsync(newItem);
});

当然,这是低效且不理想的,但可能有助于其他人弄清楚原始版本中发生了什么。 更改后的行为:

【问题讨论】:

  • 我看不出问题,是有问题,对吧?
  • 我希望它尽快显示出来,而不会经历“白色渐变”阶段

标签: c# listview xamarin xamarin.forms uwp


【解决方案1】:

在 UWP 中,导航返回堆栈的视图不会保存在内存中以保存它,因此当您导航到另一个页面并返回时,前一页会被重建。然而,在这种情况下,它“淡入”的原因是动画,它内置在 UWP 中的默认 NavigationPageRenderer 中。

动画正在发生here in the code,应该可以通过在正确的位置将isAnimated 标志设置为false 来禁用动画,但我现在没有我的开发设备,所以我无法测试。

更新

看来这确实是ListViewMasterDetailPage 的UWP 实现的问题。

解决方法

向消息处理程序订阅添加一个小延迟可以解决问题:

MessagingCenter.Subscribe<NewItemPage, Item>(this, "AddItem", async (obj, item) =>
{
    await Task.Delay(100);
    var newItem = item as Item;
    Items.Add(newItem);
    await DataStore.AddItemAsync(newItem);
});

我已在 GitHub 上将问题报告为 an issue

【讨论】:

  • 感谢您的回复,但我不认为是这样,因为如果我按取消而不是保存,带有 ListView 的页面和所有项目都会立即出现
  • 你是对的,看代码可能不是这样。我会检查我的开发机器并尝试重现它
  • 我用我做的一个实验编辑了我最初的问题:用一个新的替换整个 ObservableCollection,并引发一个OnPropertyChanged(nameof(Items)) 事件。看来它已经奏效了,但我真的不想每次都创建一个集合的副本
  • 我已经用“解决方法”更新了我的答案,但问题肯定出在 XF 实现中,我已在github.com/xamarin/Xamarin.Forms/issues/8695 报告了它
  • 谢谢你,马丁,我将接受这个作为答案,因为你确认这是一个错误并提供了解决方法。
猜你喜欢
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2020-10-24
相关资源
最近更新 更多