我有一个页面,您基本上可以在其中选择一组选项(配置),然后转到下一页,您可以在其中做一些事情
使用 MVVM Light 工具包,我有一个绑定(bind)到第一页 View 的 View 模型。当用户点击一个按钮时,它会重定向到另一个 View ,这将是第二页
IE。:
Page2Command = new DelegateCommand((obj) =>
Messenger.Default.Send<Uri>(new Uri("/DoStuffView.xaml", UriKind.Relative),
Common.CommonResources.GoToDoStuffRequest)) });
问题是,第二个 View 的 View 模型(我看到它的方式)在构造函数中有几个参数,它们基本上是第一页上设置的配置的依赖项。
IE。 :
public DoStuffViewModel(ICollection<Note> availableNotes, SoundMappers soundType)
{
}
问题出在这里..如何使用用户在第一页上动态选择的数据实例化 View 模型?
我不能使用 MVVM light 提供的 ViewModelLocator 模式,因为这些 View 模型没有任何依赖关系,它们只是它们自己(或者它们可以从数据库、文件或其他任何东西中检索数据,但它们没有任何动态输入数据)。我可以通过 View 的构造函数来实现,在那里实例化 View 模型,并将新创建的 View 模型分配给 View 的 DataSource,但我认为这样做不太好。
建议?
最佳答案
正如我所见,您使用 Messenger 类发送消息,因此您熟悉 MVVM light 中的消息传递。您必须定义自己的消息类型,该类型应接受第 1 页中的参数:
public class Page2ViewModelCreateMessage : MessageBase
{
public ICollection<Note> AvailableNotes{get;set;}
public SoundMappers SoundType{get;set;}
public Page2ViewModelCreateMessage ()
{
}
public Page2ViewModelCreateMessage(ICollection<Note> availableNotes, SoundMappers soundType)
{
this.AvailableNotes = availableNotes;
this.SoundType = soundType;
}
}
您必须发送带有参数的 Page2ViewModelCreateMessage 实例并在导航时发送:
var message = new Page2ViewModelCreateMessage(myAvailableNotes, mySoundType)
Messenger.Default.Send(message);
在 Page2 上,您必须注册以接收 Page2ViewModelCreateMessage 类型的消息:
Messenger.Default.Register<Page2ViewModelCreateMessage>(this, OnPage2ViewModelCreateMessage);
..
public void OnPage2ViewModelCreateMessage(Page2ViewModelCreateMessage message)
{
var page2ViewModel = new Page2ViewModel(messsage.AvailableNotes, message.SoundType);
}
如您所见,为了更清楚,我已将您的 DoStuffViewModel 替换为 Page2ViewModel。
我希望这能帮到您。
注意:我不保证代码会像在记事本中写的那样工作。
关于silverlight - MVVM Light、Windows Phone、View & ViewModel 在页面之间导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6761604/