3

我使用 MVVM Light Toolkit 来定义视图模型和视图之间的关联。

指示容器将视图模型注册为单例实例。因此,当需要 GagaViewModel 时,将始终返回相同的实例:

public GagaViewModel GagaViewModel
{
    get
    {
        var vm = ServiceLocator.Current.GetInstance<GagaViewModel>();
        vm.Setup(); //Clear the ObservableCollection
        return vm;
    }
}

您可以单击 PriorGaga.xml 上的缩略图项。然后在 Gaga.xaml 的 GridView“MyGridView”中选择自选项目。Gaga.xaml 的代码隐藏文件:

protected override async void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
    var itemId = navigationParameter as String;
    if (String.IsNullOrEmpty(itemId))
    {
        throw new ArgumentException("navigationParameter was either null or empty");
    }

    await ((GagaViewModel)DataContext).Init(itemId); //Busy(-Indicator) while loading data from server, filling the ObservableCollection and writing the selected item down

    BringItemIntoView();
}

private void BringItemIntoView()
{
    var vm = (GagaViewModel)DataContext;

    Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                        () => MyGridView.ScrollIntoView(vm.SelectedItem));
}

这很好用。作为示例:项目 #45 立即出现在视口中(从头开始正确的视口位置)。

但是,当您单击后退按钮并通过选择任意缩略图项(我们只说 #29)返回 Gaga.xaml 时,您将看到项目 #1,然后切换到 #29(视口在容器上方移动)。有人知道下面发生了什么吗?之前 Gaga.xaml 访问的容器中是否有任何虚拟化项目?

4

1 回答 1

1

我的理解是,你的 Gaga 页面实例的生命周期是由它的NavigationCacheMode属性决定的。默认情况下,它设置为Disabled。假设您没有更改此属性,您应该在每次导航到 Gaga 页面时看到一个新实例。您可以通过在其构造函数中设置断点来验证此行为。因此,我认为每次导航到 Gaga 时,UI 的行为都应该是相同的,因为一切都是新鲜的。

(我想将此作为评论添加,因为我实际上还没有回答您的问题,但遗憾的是我没有足够的代表。我提前道歉;请不要打我!)</p>

于 2013-04-23T17:26:08.840 回答