Prism:ViewModelLocator创建视图模型实例但是如何定位它?

时间:2017-06-07 18:29:16

标签: c# wpf prism prism-6 viewmodellocator

有没有办法可以识别一个由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"

1 个答案:

答案 0 :(得分:2)

转到视图模型 - 第一种导航方式。如果将(子)视图模型实例(而不是类型)传递给ShowWindow,则可以使用所需的任何数据创建该实例。

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

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

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