我是MVVM的新手,仍然在学习。我以下面的链接中的文章为例,以一个带有选项卡式工作区的简单应用程序来实现,该工作区使用两个视图:“所有客户”和“新客户”。
在以上文章使用的示例中,shell应用程序(MainWindowViewModel)使用带有两个按钮的控制面板:“查看所有客户”和“创建新客户”。当用户单击这些按钮时,相应的视图在主外壳的选项卡式工作区中打开。
我现在的问题是:如果我们要在“所有客户”视图上添加按钮“创建新客户”,并且当用户单击此按钮时,“新客户”视图将在主菜单中作为选项卡式工作区打开。外壳,这样做的最佳方法是什么?
例如,我是否需要使用消息传递服务向所有同事广播/发送“ CreateNewCustomer”消息,并且将主外壳程序(MainWindowViewModel)注册为“ CreateNewCustomer”,然后其操作是实例化“标签式工作区中的“新客户”视图?
或者是否有更好/更简单/更优雅的方法?请注意,我没有使用Prism,MVVMLight或任何其他MVVM框架。在学习过程中,我正在建立自己的框架。
非常感谢您抽出宝贵时间回答我的问题。
答案 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。