只是摆弄一些WP8.1开发+ MVVM-Light工具包,我很难弄清楚如何实现某些目标......
基本上:
View
(让我们称之为View1
),它有一个控件(在这种情况下为LongListSelector
),它被数据绑定到一个项目集合(让&# 39; s称呼他们为DataItem
)(由Service
中的ViewModel
填充我希望如此:
View
(称为View2
),这将创建一个ViewModel
的新View2
或重新使用现有的Key
(取决于SimpleIoC
中DataItem
个实例的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}}根据所选项目的属性。我怎样才能做到这一点?
非常感谢任何帮助。
答案 0 :(得分:3)
您是否尝试在MVVMLight中使用Messenger
?尝试在ViewModel2
中创建ViewModelLocator
的实例,其中键是默认值。在ViewModel的构造函数中,注册以接收string
属性(假设item.Name
是string
),如下所示:
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;
}