c# - 使用 mvvm 导航返回时,何时在 ListView 中重新加载项目

标签 c# listview mvvm win-universal-app

我正在开发 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/

    相关文章:

    c# - 有没有办法将属性标记为条件

    c# - 将列表一分为二并重新排序的巧妙方法?

    c# - 为什么不能转换此double值

    android - 什么是modal selection选择模式?

    c# - WPF&MVVM : Library System. Windows.Interactivity 不再可用?

    javascript - JQuery 根据另一个输入框是否有值切换输入框

    xaml - Xamarin 表单(跨平台): Multiple type of cells in ListView

    android - 自定义列表的 AutoCompleteTextView 问题

    mvvm - 在UWP中,只读的计算属性未在View中更新

    wpf - 如何在另一个 xaml 的控件上应用双动画?