0

有没有一种方法可以在打开它的相应窗口时识别由 prism 的 ViewModelLocator 创建的 ChildViewModel 实例?

我想触发 ChildViewModel 应该加载它的数据,基于来自 MasterViewModel 的参数。

在代码中,inMasterViewModel有一个ICommandin a,负责通过发布事件请求打开一个新的子窗口,并且有一个对应的订阅者。

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 对应的视图(在本例中为窗口)。

public void ShowWindow(Type viewModelType)
{
   Type view = ResolveView(viewModelType);
   Window w = (Window)Activator.CreateInstance(view);
   w.Show();
}

适当的窗口的 xaml

ViewModelLocator.AutoWireViewModel="True"
4

1 回答 1

2

选择视图模型优先的导航样式。如果您将(子)视图模型实例(而不是类型)传递给ShowWindow,则可以使用所需的任何数据创建它。

可能,您将数据作为 的有效负载传递OpenNewChildWindowPubSubEvent,然后订阅者创建视图模型。或者您立即在命令中创建视图模型并将其作为事件的有效负载传递。

无论如何,不​​要从视图模型类型中解析视图类型只是为了从视图中解析视图模型类型:-)

顺便说一句,这ViewModelLocator很棒并且确实简化了事情,但是您不想在这里使用它,因为您不是一个 shell 中导航,而是创建新窗口。如果您愿意,您的视图模型将实现INavigationAware,并且您将数据作为参数传递给子视图模型RequestNavigate...

于 2017-06-07T19:07:05.903 回答