有没有办法可以识别一个由prism的ViewModelLocator创建的ChildViewModel实例,打开它的相应窗口?
我想触发ChildViewModel应该根据源自MasterViewModel的参数加载它的数据。
在代码中,MasterViewModel
中有一个ICommand
,负责通过发布事件请求打开一个新的子窗口,并且有一个相应的订阅者。
public ICommand OpenNewChildWindow()
{
Publish(new OpenNewChildWindowPubSubEvent());
// Maybe I can publish a new PubSubEvent here
// but how can I target just the recently created ChildViewModel?
}
请注意,MasterViewModel
对UI实现一无所知。
订阅者在自定义ShowWindow
上调用WindowManager
方法,该方法基本上解析了与传入的ViewModel相对应的View(此实例中的窗口)。
public void ShowWindow(Type viewModelType)
{
Type view = ResolveView(viewModelType);
Window w = (Window)Activator.CreateInstance(view);
w.Show();
}
适合窗口的xaml
ViewModelLocator.AutoWireViewModel="True"
答案 0 :(得分:2)
转到视图模型 - 第一种导航方式。如果将(子)视图模型实例(而不是类型)传递给ShowWindow
,则可以使用所需的任何数据创建该实例。
或许,您将数据作为OpenNewChildWindowPubSubEvent
的有效负载传递,然后订阅者创建视图模型。或者,您可以立即在命令中创建视图模型,并将其作为事件的有效负载传递。
无论如何,不要从视图模型类型中解析视图类型,只是为了从视图中解析视图模型类型: - )
顺便说一句,ViewModelLocator
很棒并且确实简化了事情,但是你不想在这里使用它,因为你没有在一个shell中导航,但创建新窗口。如果愿意,您的视图模型会实现INavigationAware
,并且您将数据作为参数传递给子视图模型RequestNavigate
...