【问题标题】:Correct way to transfer SelectedItemViewModel to another page in Windows Phone 8.1在 Windows Phone 8.1 中将 Selected Item ViewModel 转移到另一个页面的正确方法
【发布时间】:2015-03-21 03:12:27
【问题描述】:

我目前正在构建一个通用应用程序,但我现在专注于它的 WP8.1 部分。我在这个项目中使用 MVVMLight。

为简单起见,我们假设我的项目中只有 2 个页面。

Page1.xaml 包含一个包含各种项目的列表。 Page1.xaml 绑定到它自己的 ViewModel,即 Page1ViewModel。列表中的每个项目都代表一个 viewModel,即 ItemViewModel。

当我点击一个项目时,我会调用以下代码:

public RelayCommand<ItemViewModel> ItemTapCommand
{
    get
    {
        return this._itemTapCommand ?? (this._itemTapCommand = 
                new RelayCommand<ItemViewModel>((msg) => 
                ExecuteItempTapCommand(msg)));
    }
}

当点击列表中的一项时,我调用以下代码:

private object ExecuteItempTapCommand(ItemViewModel selectedItemViewModel)
{
    Page2ViewModel page2ViewModel = 
    SimpleIoc.Default.GetInstance<ItemViewModel>();

    page2ViewModel.SelectedItem = selectedItemViewModel;

    _navigationService.Navigate(typeof(Page2), 
     selectedItemViewModel);
     return null;
}

如您所见,我使用 Ioc 创建获取 Page2ViewModel 的实例,然后将 SelectedItem 设置为 selectedItemViewModel。

设置后,我导航到绑定到我的 Page2ViewModel 的 Page2。

我想知道的是,以上可以吗?在处理将对象从一个页面传递到另一个页面时,我已经看到很多示例是通过传递一个 ID 来完成的,然后我从 Page2 请求信息,但是当我需要的大部分信息已经在我的SelectedItemViewModel 因为它代表了我在 Page1 中的列表中被点击的项目。

如果不正确,使用 MVVMLight 解决此问题的最佳方法是什么?

你能提供样品吗?我已经看到了一些关于消息传递的信息,但我不确定这将如何工作,就像我导航到我的 page2 一样,Page2ViewModel 只会在页面创建时启动,那么它如何接收消息呢?我上面的方式似乎启动了 Page2ViewModel 和我的 Pag2 加载,它正在重新使用它并且一切都正确绑定,但我不确定这是正确的方法。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: c# mvvm windows-phone-8.1 mvvm-light win-universal-app


    【解决方案1】:

    在您的 Page2ViewModel 中,为什么不使用

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        Page2SelectedItem = e.Parameter as ItemViewModel; 
        base.OnNavigatedTo(e);
    }
    

    看起来您已经在 _navigationService.Navigate 调用中打包了这些数据。

    有了这样的设置,如果你更改为:

    private object ExecuteItempTapCommand(ItemViewModel selectedItemViewModel)
    {        
        _navigationService.Navigate(typeof(Page2), selectedItemViewModel);
        return null; 
    }
    

    【讨论】:

    • 我确信这会起作用,但你不是通过使用代码来破坏 mvvm 规则吗?
    【解决方案2】:

    如果你在此之前做了一些工作,你可以使用 ViewModel 来获取它。

    阅读 Marco Minerva 的博文Calling ViewModel methods in response to Page navigation events using MVVM Light in WinRT

    其中解释了如何对 ViewModel 中的 OnNavigatedTo 和 OnNavigatedFrom 做出反应。

    这是一个非常酷的解决方案。

    【讨论】:

    • 感谢那篇文章。有趣好吧!尽管访问 ViewModel 仍然依赖于后面的代码。我不确定您所说的“如果您在此之前做一些工作,您可以使用 ViewModel 来获取它”是什么意思?您是在回答我的问题,说可以做我所做的事情还是在说其他话?谢谢。
    • @Thierry 当我说你需要先做一些工作时,我的意思是实现 BindablePage 然后让每个页面都继承自它。这样一来,您只需在一个地方拥有代码隐藏逻辑,这不会有问题,因为 View 知道 ViewModel 是可以的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多