我正在开发 UWP Windows 10 应用程序。它包含一个 ListView ,当我点击一个项目时,它会将您重定向到另一个页面 我试图在导航回上一页时重新选择最后一个项目。
我的 ListView 的 ItemSource 绑定(bind)到 ObservableCollection
并按预期加载我的项目,但是当我向后导航时,它会保持项目处于选中状态但不可见。
我读过各种文章:
Make ListView.ScrollIntoView Scroll the Item into the Center of the ListView
ListViewBase.ScrollIntoView methods
Windows 10 ScrollIntoView() is not scrolling to the items in the middle of a listview
还有很多其他的,我尝试使用上面提到的上一篇文章中的扩展,它为 Listview
提供了各种扩展。我以为我会很好,但无济于事!
在调查和尝试各种事情时,我想我会打个电话
protected async override void OnNavigatedTo(NavigationEventArgs e)
并调用以下代码:
if (e.NavigationMode == NavigationMode.Back)
{
if (GetViewModel.SelectedChannel != null)
{
await this.lvwChannels.ScrollToIndex
(GetViewModel.SelectedIndex);
}
}
或者
if (e.NavigationMode == NavigationMode.Back)
{
if (GetViewModel.SelectedChannel != null)
{
await this.lvwChannels.ScrollToItem
(GetViewModel.SelectedItem);
}
}
但它仍然无法正常工作。
这是当我注意到我的 Listview.Items.count 返回 0 并且该项目已重新加载时,但我认为它们将在稍后阶段重新加载,所以我的问题是:
但我注意到以下内容:
public async static Task ScrollToIndex(this ListViewBase listViewBase, int index)
我的
listViewBase.Items.Count
是0??为什么?ScrollViewer
在 ListView 中,它没有找到它? var selectorItem = listViewBase.ContainerFromIndex(index) as SelectorItem;
selectorItem
为空,因为它没有根据索引找到任何内容。索引是唯一似乎设置正确的东西,即 10、23、37有人能指出我正确的方向吗?我认为这是一个时间问题,并且我的 ObservableCollection 在此阶段尚未重新绑定(bind)。我可以在调用 ScrollIntoView 之前重新绑定(bind),但这仍然不能解决我的 listViewBase 为空的事实。
有任何想法吗?
谢谢。
最佳答案
这似乎是一个时间问题,虽然我不是 100% 确定这是解决问题的正确方法,但它似乎已经通过在 Loaded 事件中调用 ScrollIntoView 来解决它:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
if (GetViewModel.SelectedChannel != null)
lvwChannels.ScrollIntoView(GetViewModel.SelectedChannel);
}
我想我也没有违反任何 MVVM 规则,因为它只在这个阶段处理 UI。
当从 Loaded 事件调用时,我的 ObservableCollection 都已自动重新加载,因为它已绑定(bind),并且 SelectedChannel 也已正确设置,并且一切似乎都按预期工作。
正如我在下面的回复中提到的,默认情况下,所选项目现在突出显示并显示在列表顶部,我希望它居中。
如果有更好的方法可以做到这一点,请告诉我,但现在必须这样做。
谢谢
关于c# - 使用 mvvm 导航返回时,何时在 ListView 中重新加载项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34386959/