WPF MVVM-从另一个ViewModel实例化一个ViewModel

时间:2020-02-04 01:28:45

标签: c# wpf mvvm

我是MVVM的新手,仍然在学习。我以下面的链接中的文章为例,以一个带有选项卡式工作区的简单应用程序来实现,该工作区使用两个视图:“所有客户”和“新客户”。

https://docs.microsoft.com/en-us/archive/msdn-magazine/2009/february/patterns-wpf-apps-with-the-model-view-viewmodel-design-pattern#relaying-command-logic

在以上文章使用的示例中,shell应用程序(MainWindowViewModel)使用带有两个按钮的控制面板:“查看所有客户”和“创建新客户”。当用户单击这些按钮时,相应的视图在主外壳的选项卡式工作区中打开。

我现在的问题是:如果我们要在“所有客户”视图上添加按钮“创建新客户”,并且当用户单击此按钮时,“新客户”视图将在主菜单中作为选项卡式工作区打开。外壳,这样做的最佳方法是什么?

例如,我是否需要使用消息传递服务向所有同事广播/发送“ CreateNewCustomer”消息,并且将主外壳程序(MainWindowViewModel)注册为“ CreateNewCustomer”,然后其操作是实例化“标签式工作区中的“新客户”视图?

或者是否有更好/更简单/更优雅的方法?请注意,我没有使用Prism,MVVMLight或任何其他MVVM框架。在学习过程中,我正在建立自己的框架。

非常感谢您抽出宝贵时间回答我的问题。

1 个答案:

答案 0 :(得分:1)

如果我按照您的描述。

您应该有一个WindowViewmodel。

这可能包含选项卡的视图模型集合。或者,如果没有,则可以。

无论工作方式如何,您正在使用的用户控件上都会有一个按钮,并且它是您要在其中显示其他内容的同一窗口的子窗口。

向WindowViewmodel添加NewUserCommand。这则消息将NewCustomerViewModel添加到您的tabcontrol绑定到的集合中。首先使用viewmodel将选项卡模板化为NewCustomerView。

剩下的问题是如何从子用户控件中的按钮转到窗口的视图模型。 您可以通过使用relativesource绑定来实现。 看起来像这样:

{Binding DataContext.NewUserCommand,
  RelativeSource={RelativeSource AncestorType={x:Type YourWindowType}}}

这假定您可以使用“选项卡式工作区”的tab控件。如果您以某种方式考虑到窗户,那么我建议您重新考虑。

我还要说的是,学习wpf足够困难,而无需选择一个框架来简化您的命令。我建议您看一下mvvmlight和relaycommand的源代码。有很多东西。 Messenger也很方便使用。我经常不使用任何东西,而使用Relaycommand和Messenger来发送mvvmlight btw。