MVVM-Light将数据传递给新的ViewModel

时间:2014-11-22 07:14:42

标签: c# windows-phone-8 mvvm windows-phone-8.1 mvvm-light

只是摆弄一些WP8.1开发+ MVVM-Light工具包,我很难弄清楚如何实现某些目标......

基本上:

  • 我有一个View(让我们称之为View1),它有一个控件(在这种情况下为LongListSelector),它被数据绑定到一个项目集合(让&# 39; s称呼他们为DataItem)(由Service中的ViewModel填充

我希望如此:

  • 当用户点击此控件中的特定项目时,它会将点击的项目(或此项目的属性)传递给新的View(称为View2),这将创建一个ViewModel的新View2或重新使用现有的Key(取决于SimpleIoCDataItem个实例的ViewModel,由DataItem中的某个属性决定)。
  • 这个新Service然后使用其{< 1}}中传递的ViewModel的传递属性。构造函数从不同的SelectionChanged
  • 获取数据

那我怎么能做到这一点?我正在考虑在控件的Service事件上创建/注册新的Property,并将其传递到 private void LongListSelector_SelectionChanged(object sender, SelectionChangedEventArgs e) { DataItem item = e.AddedItems[0] as DataItem; SimpleIoc.Default.Register(() => new ViewModel2(new Model2Service(), item.Name)); NavigationService.Navigate(new Uri("/View2.xaml", UriKind.Relative)); } DataItem,如下所示:

ViewModel2

对于轻敲的第一个 ViewModelLocator,它可以正常工作,但是当点击第二个时,则不行。 注意:我无法在DataItem中注册ViewModel2,因为我无法将View属性传递给LongListSelector的构造函数},这就是为什么我试图在其他地方注册它。

不确定这是否遵循MVVM架构,我认为不是this answer指出我不应该在View处理此问题。

回顾一下,我希望用户能够点击ViewModel中的项目,然后将用户导航到绑定到新(或现有)的新{{1}} {{1}}根据所选项目的属性。我怎样才能做到这一点?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

您是否尝试在MVVMLight中使用Messenger?尝试在ViewModel2中创建ViewModelLocator的实例,其中键是默认值。在ViewModel的构造函数中,注册以接收string属性(假设item.Namestring),如下所示:

MessengerInstance.Register<string>(this,name=>{NameProperty=name;});

然后在LongListSelector_SelectionChanged中,像这样发送item.Name

Messenger.Default.Send<string>(item.Name);

然后导航到该页面。


标记为解决方案但下面的整个评论帖子显示了更多详细信息

答案 1 :(得分:1)

如果您正在使用 UWP与Template Studio 10和MVVM Light ,并希望:

  • 访问NavigationServicesEx.Navigate方法中传递的参数

  • 在导航页面时调用ViewModel中的方法。

Marco Minerva的这个blog是我能找到的与UWP,Templates Studio 10和MVVM Light 5.0最新的唯一指导(再次感谢Marco!)

tl; dr 它通过挂钩到vanilla NavigationServiceEx类中缺少的Frame_Navigating事件来工作。

创建博客中描述的INAVigable界面:

public interface INavigable
{
    Task OnNavigatedToAsync(object parameter, NavigationMode mode);
    void OnNavigatingFrom(NavigatingCancelEventArgs e);
    void OnNavigatedFrom();
}

为NavigationServicesEx类中的Frame.Navigating事件添加处理程序(带有一些额外的管道,请参阅博客),然后在ViewModel中实现INavigable接口。

然后,您就可以访问在Navigate调用中传递的参数:

NavigationServiceEx.Navigate(typeof(DestinationPage).FullName, yourParameter);

在ViewModel中实现的OnNavigatedToAsync方法:

public Task OnNavigatedToAsync(object parameter, NavigationMode mode)
{
    if (parameter != null)
    {
        YourThing thing = parameter as YourThing;
        this.UseYourThing(thing);
    }
    return Task.CompletedTask;
}