我已经实现了INotifyCollectionChanged绑定到我的ObservableCollection,这一切都正常。但是我的数据集来自JSON webservice,还有其他系统可以更新它以及我的应用程序。因此,我需要不时地将JSON刷新到我的收藏中。
我可以通过计时器刷新集合,这一切都运行正常,但是当我这样做时屏幕闪烁,因为我猜它重绘屏幕,看起来很糟糕,所以我想知道是否有办法阻止它。显然,INotifyCollectionChanged界面在这种情况下没有过分帮助,因为应用程序没有更改集合,但是另一个应用程序可能有,所以我需要刷新我的集合以确保它是最新的,然后我可以使用任何进一步的更改INotifyCollectionChanged界面并停止刷新闪烁!
一些代码如果有帮助,下面是我的ObservableCollection:
private WebJSON _webjson;
private ObservableCollection<Group> _groups;
private ObservableCollection<Group> Groups
{
get { return _groups; }
set
{
if (_groups != value)
{
_groups = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Groups)));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
在我的主要构造函数中,我有:
public TestPage()
{
this.InitializeComponent();
DispatcherTimer timer;
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(60000);
timer.Tick += async (s, e) =>
{
Groups = new ObservableCollection<Group>(await _webjson.GetGroupsAsync());
};
timer.Start();
}
当计时器刷新我的webjson类中的数据时,这是闪烁或闪烁屏幕的位。 webjson.GetGroupsAsync是继续使用JSON API并获取数据的类,我没有包含该代码,因为我认为它不相关。
我在应用程序中执行的任何更新工作正常,它只是从定时器上的JSON API重新获取数据,导致屏幕闪烁。如果我在按钮或CommandBar等上实现手动刷新,也会发生同样的事情。
然后我只是使用x:Bind将数据绑定到GridView,就像你一样。
我还尝试使用标准计时器,当它触发调用时:
private async Task Refresh()
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, async () =>
{
Groups = new ObservableCollection<Group>(await _webjson.GetGroupsAsync());
});
}
并发生相同的闪光/闪烁。
反正有没有从JSON API重新获取数据并刷新我的gridview而没有令人烦恼的刷新闪烁?
谢谢
对于有同样问题的人,我刚刚解决了。它归结为默认转换。所以在你的GridView中你只需关闭转换,最简单的方法似乎是将GridView的ItemContainerTransitions设置为空集合,例如:
<GridView.ItemContainerTransitions>
<TransitionCollection />
</GridView.ItemContainerTransitions>
然后就像魔术一样,刷新眨眼就消失了!
你的问题在于这一行:
Groups = new ObservableCollection<Group>(await _webjson.GetGroupsAsync());
最佳解决方案是比较新组和先前组的内容,然后相应地添加/删除/替换项目。虽然你可以像你一样禁用动画,但这可能会导致其他问题(例如,我认为滚动条位置不会以这种方式记住)。